diff --git a/README.md b/README.md index 03ba7ed3..fd77d495 100644 --- a/README.md +++ b/README.md @@ -1 +1,82 @@ -# java-blackjack \ No newline at end of file +# java-blackjack + +# ๐Ÿ“Œ ์—ฐ๋ฃŒ ์ฃผ์ž… + +## ๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ + +์šฐ๋ฆฌ ํšŒ์‚ฌ๋Š” ๋ Œํ„ฐ์นด๋ฅผ ์šด์˜ํ•˜๊ณ  ์žˆ๋‹ค. + +ํ˜„์žฌ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ์ฐจ๋Ÿ‰์€ Sonata 2๋Œ€, Avante 1๋Œ€, K5 2๋Œ€๋กœ ์ด 5๋Œ€์˜ ์ฐจ๋Ÿ‰์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋‹ค. + +๊ณ ๊ฐ์ด ์ธํ„ฐ๋„ท์œผ๋กœ๋ถ€ํ„ฐ ์˜ˆ์•ฝํ•  ๋•Œ ์—ฌํ–‰ํ•  ๋ชฉ์ ์ง€์˜ ๋Œ€๋žต์ ์ธ ์ด๋™๊ฑฐ๋ฆฌ๋ฅผ ์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค. + +์ด ์ด๋™๊ฑฐ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด ์ฐจ๋Ÿ‰ ๋ณ„๋กœ ํ•„์š”ํ•œ ์—ฐ๋ฃŒ๋ฅผ ์ฃผ์ž…ํ•œ๋‹ค. ์ฐจ๋Ÿ‰ ๋ณ„๋กœ ์ฃผ์ž…ํ•ด์•ผ ํ•  ์—ฐ๋ฃŒ๋Ÿ‰์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. + +``` +* Sonata : 10km/๋ฆฌํ„ฐ +* Avante : 15km/๋ฆฌํ„ฐ +* K5 : 13km/๋ฆฌํ„ฐ +``` + +## ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ ์‚ฌํ•ญ + +- ์ƒ์†๊ณผ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•œ๋‹ค. +- ์œ„ ์š”๊ตฌ์‚ฌํ•ญ์„ `if/else` ์ ˆ์„ ์“ฐ์ง€ ์•Š๊ณ  ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. + +## ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์‚ฌํ•ญ + +- [x] `Car` ํด๋ž˜์Šค ์ถ”์ƒํ™” (`Car`) + - [x] ์ฃผ์ž…ํ•ด์•ผํ•  ์—ฐ๋ฃŒ๋Ÿ‰ ๊ณ„์‚ฐ (`Car.getChargeQuantity()`) +- [x] ํŒŒ์ƒ ํด๋ž˜์Šค ๊ตฌํ˜„ + + - [x] `Sonata` ํด๋ž˜์Šค ๊ตฌํ˜„ (`Sonata`) + - [x] ๋ฆฌํ„ฐ๋‹น ์ด๋™ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ (`Sonata.getDistancePerLiter()`) + - [x] ์—ฌํ–‰ํ•˜๋ ค๋Š” ๊ฑฐ๋ฆฌ ๋ฐ˜ํ™˜ (`Sonata.getTripDistance()`) + - [x] ์ฐจ์ข…์˜ ์ด๋ฆ„ ๋ฐ˜ํ™˜ (`Sonata.getName()`) + + - [x] `Avante` ํด๋ž˜์Šค ๊ตฌํ˜„ (`Avante`) + - [x] ๋ฆฌํ„ฐ๋‹น ์ด๋™ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ (`Avante.getDistancePerLiter()`) + - [x] ์—ฌํ–‰ํ•˜๋ ค๋Š” ๊ฑฐ๋ฆฌ ๋ฐ˜ํ™˜ (`Avante.getTripDistance()`) + - [x] ์ฐจ์ข…์˜ ์ด๋ฆ„ ๋ฐ˜ํ™˜ (`Avante.getName()`) + + - [x] `K5` ํด๋ž˜์Šค ๊ตฌํ˜„ (`K5`) + - [x] ๋ฆฌํ„ฐ๋‹น ์ด๋™ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ (`K5.getDistancePerLiter()`) + - [x] ์—ฌํ–‰ํ•˜๋ ค๋Š” ๊ฑฐ๋ฆฌ ๋ฐ˜ํ™˜ (`K5.getTripDistance()`) + - [x] ์ฐจ์ข…์˜ ์ด๋ฆ„ ๋ฐ˜ํ™˜ (`K5.getName()`) + +--- + +# ๐Ÿ“Œ ๋ธ”๋ž™์žญ + +# ๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ + +๋ธ”๋ž™์žญ ๊ฒŒ์ž„์„ ๋ณ€ํ˜•ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•œ๋‹ค. ๋ธ”๋ž™์žญ ๊ฒŒ์ž„์€ ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด ์ค‘ ์นด๋“œ์˜ ํ•ฉ์ด 21 ๋˜๋Š” 21์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ˆซ์ž๋ฅผ ๊ฐ€์ง€๋Š” ์ชฝ์ด ์ด๊ธฐ๋Š” ๊ฒŒ์ž„์ด๋‹ค. + +- ์นด๋“œ์˜ ์ˆซ์ž ๊ณ„์‚ฐ์€ ์นด๋“œ ์ˆซ์ž๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜๋ฉฐ, ์˜ˆ์™ธ๋กœ Ace๋Š” 1 ๋˜๋Š” 11๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, King, Queen, Jack์€ ๊ฐ๊ฐ 10์œผ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค. +- ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•˜๋ฉด ํ”Œ๋ ˆ์ด์–ด๋Š” ๋‘ ์žฅ์˜ ์นด๋“œ๋ฅผ ์ง€๊ธ‰ ๋ฐ›์œผ๋ฉฐ, ๋‘ ์žฅ์˜ ์นด๋“œ ์ˆซ์ž๋ฅผ ํ•ฉ์ณ 21์„ ์ดˆ๊ณผํ•˜์ง€ ์•Š์œผ๋ฉด์„œ 21์— ๊ฐ€๊น๊ฒŒ ๋งŒ๋“ค๋ฉด ์ด๊ธด๋‹ค. 21์„ ๋„˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์›ํ•œ๋‹ค๋ฉด + ์–ผ๋งˆ๋“ ์ง€ ์นด๋“œ๋ฅผ ๊ณ„์† ๋ฝ‘์„ ์ˆ˜ ์žˆ๋‹ค. +- ๋”œ๋Ÿฌ๋Š” ์ฒ˜์Œ์— ๋ฐ›์€ 2์žฅ์˜ ํ•ฉ๊ณ„๊ฐ€ 16์ดํ•˜์ด๋ฉด ๋ฐ˜๋“œ์‹œ 1์žฅ์˜ ์นด๋“œ๋ฅผ ์ถ”๊ฐ€๋กœ ๋ฐ›์•„์•ผ ํ•˜๊ณ , 17์  ์ด์ƒ์ด๋ฉด ์ถ”๊ฐ€๋กœ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค. +- ๊ฒŒ์ž„์„ ์™„๋ฃŒํ•œ ํ›„ ๊ฐ ํ”Œ๋ ˆ์ด์–ด๋ณ„๋กœ ์ŠนํŒจ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. + +## ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ ์‚ฌํ•ญ + +- ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•œ๋‹ค. +- 3๊ฐœ ์ด์ƒ์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค. +- ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค. + +## ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์‚ฌํ•ญ + +- [x] ์‚ฌ๋žŒ ์ด๋ฆ„ ์ž…๋ ฅ๋ฐ›๊ธฐ(`InputView.getPlayerNames`) +- [x] ์นด๋“œ๋Š” ๋ฌธ์–‘๊ฐ’(`Suit`)๊ณผ ์ˆซ์ž๊ฐ’(`Denomination`)์„ ๊ฐ€์ง„๋‹ค (Card) + - [x] ๋ฌธ์–‘๊ฐ’(`Suit`)๊ณผ ์ˆซ์ž๊ฐ’(`Denomination`)์€ `enum`์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค +- [x] ์นด๋“œ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ง„ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ Deck ๊ตฌํ˜„ + - [x] ์นด๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค (`Deck.setupCard()`) + - [x] ์นด๋“œ๋ฅผ ์„ž๋Š”๋‹ค (`Deck.shuffle()`) + - [x] ์นด๋“œ ํ•œ ์žฅ์„ ๊บผ๋‚ธ๋‹ค (`Deck.popCard()`) +- [x] `Dealer`๋Š” `Player` ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†์„ ๋ฐ›๋Š”๋‹ค +- [x] ์นด๋“œ ์ˆซ์ž๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค (`Player.calculateScore()`) +- [x] ๋”œ๋Ÿฌ๊ฐ€ ํ”Œ๋ ˆ์ด์–ด์—๊ฒŒ ์นด๋“œ ๋ฐฐ๋ถ„ํ•œ๋‹ค (`Dealer.allocateCard()`) +- [x] ๋”œ๋Ÿฌ์˜ ์ฒ˜์Œ ๋ฐ›์€ 2์žฅ์˜ ์นด๋“œ ํ•ฉ๊ณ„๊ฐ€ 16์ดํ•˜๋ผ๋ฉด ์นด๋“œ ํ•œ ์žฅ์„ ์ถ”๊ฐ€๋กœ ๋ฐ›๋Š”๋‹ค (`Dealer.addOneMoreCard`) +- [x] ์นด๋“œ ์ถ”๊ฐ€ ์—ฌ๋ถ€ ๋ฌป๊ธฐ (`InputView.askAddCard()`) +- [x] ์šฐ์Šน์ž๋ฅผ ์ฐพ๋Š”๋‹ค (`Judgement.findWinner()`) +- [x] ์ตœ์ข… ์ŠนํŒจ ๊ณ„์‚ฐํ•˜๊ธฐ (`Judgement.judgeResult()`) diff --git a/src/main/java/blackjack/Application.java b/src/main/java/blackjack/Application.java new file mode 100644 index 00000000..7498de0a --- /dev/null +++ b/src/main/java/blackjack/Application.java @@ -0,0 +1,11 @@ +package blackjack; + +import blackjack.controller.BlackjackGame; + +public class Application { + + 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..bbf19e6c --- /dev/null +++ b/src/main/java/blackjack/controller/BlackjackGame.java @@ -0,0 +1,88 @@ +package blackjack.controller; + +import blackjack.domain.Dealer; +import blackjack.domain.Judgement; +import blackjack.domain.Player; +import blackjack.view.InputView; +import blackjack.view.OutputView; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class BlackjackGame { + + private static final int THRESHOLD = 21; + + public void play() { + List playersName = getPlayerName(); + Dealer dealer = new Dealer(); + List players = playersName.stream().map(Player::new) + .collect(Collectors.toList()); + + List allGamblers = getAllGamblers(dealer, players); + allGamblers.forEach(dealer::allocateInitialCards); + OutputView.printPlayersCard(allGamblers); + + betting(dealer, players); + + checkIfDealerGotMoreCard(dealer); + + Judgement judgement = new Judgement(allGamblers); + OutputView.printGameResult(allGamblers, judgement.findWinners()); + } + + private void betting(Dealer dealer, List players) { + List alivePlayers = players; + boolean isPlaying; + do { + isPlaying = isAnyOneGettingMoreCard(dealer, alivePlayers); + alivePlayers = filterBustedPlayer(alivePlayers); + } + while (isPlaying); + } + + private List filterBustedPlayer(List alive) { + return alive.stream().filter(player -> player.calculateScore() <= THRESHOLD) + .collect(Collectors.toList()); + } + + private boolean isAnyOneGettingMoreCard(Dealer dealer, List players) { + boolean isPlaying = false; + for (Player player : players) { + isPlaying = isPlayerGettingMoreCard(dealer, player); + } + return isPlaying; + } + + private boolean isPlayerGettingMoreCard(Dealer dealer, Player player) { + boolean answer = InputView.askAddCard(player); + if (answer) { + dealer.allocateCard(player); + OutputView.printJoinedCardInfo(player); + OutputView.printNextLine(); + return true; + } + return false; + } + + private List getPlayerName() { + List playersName = InputView.getPlayersName(); + OutputView.printInitialCardDistribute(playersName); + return playersName; + } + + private void checkIfDealerGotMoreCard(Dealer dealer) { + if (dealer.addOneMoreCard()) { + OutputView.printDealerReceived(); + } + } + + private List getAllGamblers(Dealer dealer, List players) { + List allGamblers = new ArrayList<>(); + allGamblers.add(dealer); + allGamblers.addAll(players); + return allGamblers; + } + + +} diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java new file mode 100644 index 00000000..6586c641 --- /dev/null +++ b/src/main/java/blackjack/domain/Card.java @@ -0,0 +1,29 @@ +package blackjack.domain; + +public class Card { + + private final Suit suit; + private final Denomination denomination; + + public Card(Suit suit, Denomination denomination) { + this.suit = suit; + this.denomination = denomination; + } + + public Suit getSuit() { + return suit; + } + + public Denomination getDenomination() { + return denomination; + } + + public String getDenomiationCountstring() { + return denomination.getCountString(); + } + + public String getSuitName() { + return suit.getName(); + } + +} diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java new file mode 100644 index 00000000..7203d004 --- /dev/null +++ b/src/main/java/blackjack/domain/Dealer.java @@ -0,0 +1,39 @@ +package blackjack.domain; + +public class Dealer extends Player { + + private static final int SCORE_THRESHOLD = 16; + private static final String DEALER = "๋”œ๋Ÿฌ"; + private static final int TWICE = 2; + + private final Deck deck; + + public Dealer() { + super(DEALER); + this.deck = new Deck(); + } + + public void allocateInitialCards(Player player) { + for (int i = 0; i < TWICE; i++) { + Card popped = deck.popCard(); + player.receiveCard(popped); + } + } + + public void allocateCard(Player player) { + Card popped = deck.popCard(); + player.receiveCard(popped); + + } + + public boolean addOneMoreCard() { + int score = calculateScore(); + if (score <= SCORE_THRESHOLD) { + cards.add(deck.popCard()); + return true; + } + return false; + } + + +} diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java new file mode 100644 index 00000000..a8b64529 --- /dev/null +++ b/src/main/java/blackjack/domain/Deck.java @@ -0,0 +1,41 @@ +package blackjack.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Deck { + + private final List cards; + + public Deck() { + cards = new ArrayList<>(); + setupCard(); + shuffle(); + } + + private void setupCard() { + for (Suit suit : Suit.values()) { + setDenomination(suit); + } + } + + private void setDenomination(Suit suit) { + for (Denomination denomination : Denomination.values()) { + cards.add(new Card(suit, denomination)); + } + } + + private void shuffle() { + Collections.shuffle(cards); + } + + public Card popCard() { + Card popped = cards.remove(0); + return new Card(popped.getSuit(), popped.getDenomination()); + } + + public int getCardsCount() { + return cards.size(); + } +} diff --git a/src/main/java/blackjack/domain/Denomination.java b/src/main/java/blackjack/domain/Denomination.java new file mode 100644 index 00000000..1c6cba4f --- /dev/null +++ b/src/main/java/blackjack/domain/Denomination.java @@ -0,0 +1,37 @@ +package blackjack.domain; + +public enum Denomination { + ACE(1, "A"), + 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(10, "J"), + QUEEN(10, "Q"), + KING(10, "K"); + + private final int count; + private final String countString; + + Denomination(final int count, final String countString) { + this.count = count; + this.countString = countString; + } + + public boolean isAce() { + return this == ACE; + } + + public int getCount() { + return count; + } + + public String getCountString() { + return countString; + } +} diff --git a/src/main/java/blackjack/domain/Judgement.java b/src/main/java/blackjack/domain/Judgement.java new file mode 100644 index 00000000..d0d3912c --- /dev/null +++ b/src/main/java/blackjack/domain/Judgement.java @@ -0,0 +1,63 @@ +package blackjack.domain; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class Judgement { + + private static final String DEALER = "๋”œ๋Ÿฌ"; + private static final int THRESHOLD = 21; + private static final String WIN = "์Šน"; + private static final String LOSE = "ํŒจ"; + + private Map playerScores; + private Map playerResults; + + public Judgement(List players) { + this.playerScores = new LinkedHashMap<>(); + this.playerResults = new LinkedHashMap<>(); + updatePlayersMap(players); + + } + + private void updatePlayersMap(List players) { + players.forEach(player -> { + playerScores.put(player.getName(), player.calculateScore()); + }); + } + + public Map findWinners() { + int dealerScore = playerScores.get(DEALER); + playerScores.remove(DEALER); + playerResults.put(DEALER, ""); + playerScores.forEach((name, score) -> { + playerResults.put(name, checkWinOrLose(dealerScore, score)); + }); + playerResults.put(DEALER, getDealerResult()); + return Collections.synchronizedMap(new LinkedHashMap<>(playerResults)); + } + + private String checkWinOrLose(int dealerScore, Integer score) { + if (score > THRESHOLD) { + return LOSE; + } + if (dealerScore > THRESHOLD || dealerScore <= score) { // ๋™์ ์ด๋ฉด ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ด๊ธฐ๊ฒŒ ์„ค์ • + return WIN; + } + return LOSE; + } + + private String getDealerResult() { + long winCount = getCount(LOSE); + long loseCount = getCount(WIN); + return winCount + WIN + " " + loseCount + LOSE; + } + + private long getCount(String indicator) { + return playerResults.values().stream() + .filter(result -> Objects.equals(result, indicator)).count(); + } +} diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java new file mode 100644 index 00000000..ce5f6f7e --- /dev/null +++ b/src/main/java/blackjack/domain/Player.java @@ -0,0 +1,47 @@ +package blackjack.domain; + +import java.util.ArrayList; +import java.util.List; + +public class Player { + + private static final int TEN = 10; + private static final int BUST_THRESHOLD = 21; + + protected String name; + protected List cards; + + public Player(final String name) { + this.name = name; + this.cards = new ArrayList<>(); + } + + public int calculateScore() { + int score = cards.stream().mapToInt(card -> card.getDenomination().getCount()).sum(); + long aceCount = cards.stream().filter(card -> card.getDenomination().isAce()).count(); + for (int i = 0; i < aceCount; i++) { + score = adjustScore(score); + } + return score; + } + + public int adjustScore(int score) { + if (score + TEN <= BUST_THRESHOLD) { + score += TEN; + } + return score; + } + + public void receiveCard(Card card) { + cards.add(card); + } + + public String getName() { + return name; + } + + public List getCards() { + return cards; + } + +} diff --git a/src/main/java/blackjack/domain/Suit.java b/src/main/java/blackjack/domain/Suit.java new file mode 100644 index 00000000..0fd6a20c --- /dev/null +++ b/src/main/java/blackjack/domain/Suit.java @@ -0,0 +1,18 @@ +package blackjack.domain; + +public enum Suit { + CLOVERS("ํด๋กœ๋ฒ„"), + DIAMONDS("๋‹ค์ด์•„๋ชฌ๋“œ"), + HEARTS("ํ•˜ํŠธ"), + SPADES("์ŠคํŽ˜์ด๋“œ"); + + private final String nameString; + + Suit(final String nameString) { + this.nameString = nameString; + } + + public String getName() { + return nameString; + } +} diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java new file mode 100644 index 00000000..9b97df8b --- /dev/null +++ b/src/main/java/blackjack/view/InputView.java @@ -0,0 +1,39 @@ +package blackjack.view; + +import blackjack.domain.Player; +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class InputView { + + private static String GET_USER_NAMES_MESSAGE = "๊ฒŒ์ž„์— ์ฐธ์—ฌํ•  ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์‰ผํ‘œ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌ)"; + private static String ASK_PLAYER_TO_ADD_CARD = "์€(๋Š”) ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›๊ฒ ์Šต๋‹ˆ๊นŒ?(์˜ˆ๋Š” y, ์•„๋‹ˆ์˜ค๋Š” n)"; + private static String YES = "y"; + private static String NO = "n"; + private static String ANSWER_ERROR_MESSAGE = "์ž˜๋ชป๋œ ์ž…๋ ฅ์ž…๋‹ˆ๋‹ค. y ๋˜๋Š” n์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."; + + public static List getPlayersName() { + Scanner SCANNER = new Scanner(System.in); + System.out.println(GET_USER_NAMES_MESSAGE); + String[] parsedInput = SCANNER.nextLine().split(","); + Stream players = Arrays.stream(parsedInput).map(String::trim); + return players.collect(Collectors.toList()); + } + + public static boolean askAddCard(Player player) { + Scanner SCANNER = new Scanner(System.in); + System.out.println(player.getName() + ASK_PLAYER_TO_ADD_CARD); + String answer = SCANNER.nextLine(); + if (YES.equals(answer)) { + return true; + } + if (NO.equals(answer)) { + return false; + } + throw new RuntimeException(ANSWER_ERROR_MESSAGE); + } + +} diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java new file mode 100644 index 00000000..8b4cdaae --- /dev/null +++ b/src/main/java/blackjack/view/OutputView.java @@ -0,0 +1,64 @@ +package blackjack.view; + +import blackjack.domain.Player; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class OutputView { + + private static final String DEALER_RECEIVED_ONE_MORE_CARD = "๋”œ๋Ÿฌ๋Š” 16์ดํ•˜๋ผ ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค."; + private static final String RESULT_DELIMITER = " - ๊ฒฐ๊ณผ: "; + private static final String FINAL_RESULT = "## ์ตœ์ข… ์ŠนํŒจ"; + private static final String COLON = ": "; + + public static void printInitialCardDistribute(List players) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("๋”œ๋Ÿฌ์™€ "); + String playersString = String.join(", ", players); + stringBuilder.append(playersString); + stringBuilder.append("์—๊ฒŒ 2์žฅ์˜ ์นด๋“œ๋ฅผ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค."); + + System.out.println(stringBuilder); + } + + public static void printPlayersCard(List players) { + players.forEach(player -> { + printJoinedCardInfo(player); + printNextLine(); + }); + printNextLine(); + } + + public static void printNextLine() { + System.out.println(); + } + + public static void printJoinedCardInfo(Player player) { + List cardsInfo = player.getCards().stream() + .map(card -> card.getDenomiationCountstring() + card.getSuitName()) + .collect(Collectors.toList()); + System.out.print(player.getName() + "์นด๋“œ: " + String.join(", ", cardsInfo)); + } + + public static void printDealerReceived() { + System.out.println(DEALER_RECEIVED_ONE_MORE_CARD); + } + + public static void printGameResult(List players, Map results) { + players.forEach(player -> { + printJoinedCardInfo(player); + System.out.println(RESULT_DELIMITER + player.calculateScore()); + }); + printNextLine(); + printFinalResult(results); + } + + private static void printFinalResult(Map results) { + System.out.println(FINAL_RESULT); + results.forEach((name, result) -> { + System.out.println(name + COLON + result); + }); + } + +} 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/rentCompany/domain/Avante.java b/src/main/java/rentCompany/domain/Avante.java new file mode 100644 index 00000000..ad148097 --- /dev/null +++ b/src/main/java/rentCompany/domain/Avante.java @@ -0,0 +1,26 @@ +package rentCompany.domain; + +public class Avante extends Car { + + private static final String CAR_NAME = "Avante"; + private static final double FUEL_EFFICIENCY = 15; + + public Avante(int tripDistance) { + super(CAR_NAME, tripDistance); + } + + @Override + double getDistancePerLiter() { + return tripDistance / FUEL_EFFICIENCY; + } + + @Override + double getTripDistance() { + return tripDistance; + } + + @Override + String getName() { + return name; + } +} diff --git a/src/main/java/rentCompany/domain/Car.java b/src/main/java/rentCompany/domain/Car.java new file mode 100644 index 00000000..7866836d --- /dev/null +++ b/src/main/java/rentCompany/domain/Car.java @@ -0,0 +1,34 @@ +package rentCompany.domain; + +public abstract class Car { + + protected String name; + protected double tripDistance; + + protected Car(String name, int distance) { + this.name = name; + this.tripDistance = distance; + } + + /** + * ๋ฆฌํ„ฐ๋‹น ์ด๋™ ๊ฑฐ๋ฆฌ. ์ฆ‰, ์—ฐ๋น„ + */ + abstract double getDistancePerLiter(); + + /** + * ์—ฌํ–‰ํ•˜๋ ค๋Š” ๊ฑฐ๋ฆฌ + */ + abstract double getTripDistance(); + + /** + * ์ฐจ์ข…์˜ ์ด๋ฆ„ + */ + abstract String getName(); + + /** + * ์ฃผ์ž…ํ•ด์•ผํ•  ์—ฐ๋ฃŒ๋Ÿ‰์„ ๊ตฌํ•œ๋‹ค. + */ + double getChargeQuantity() { + return getTripDistance() / getDistancePerLiter(); + } +} \ No newline at end of file diff --git a/src/main/java/rentCompany/domain/K5.java b/src/main/java/rentCompany/domain/K5.java new file mode 100644 index 00000000..c17bbe43 --- /dev/null +++ b/src/main/java/rentCompany/domain/K5.java @@ -0,0 +1,26 @@ +package rentCompany.domain; + +public class K5 extends Car { + + private static final String CAR_NAME = "K5"; + private static final double FUEL_EFFICIENCY = 13; + + public K5(int tripDistance) { + super(CAR_NAME, tripDistance); + } + + @Override + double getDistancePerLiter() { + return tripDistance / FUEL_EFFICIENCY; + } + + @Override + double getTripDistance() { + return tripDistance; + } + + @Override + String getName() { + return name; + } +} diff --git a/src/main/java/rentCompany/domain/RentCompany.java b/src/main/java/rentCompany/domain/RentCompany.java new file mode 100644 index 00000000..3d852c0f --- /dev/null +++ b/src/main/java/rentCompany/domain/RentCompany.java @@ -0,0 +1,35 @@ +package rentCompany.domain; + +import java.util.ArrayList; +import java.util.List; + +public class RentCompany { + private static final String COLON = " : "; + private static final String LITTER="๋ฆฌํ„ฐ\n"; + + private static List cars; + + private RentCompany() { + cars = new ArrayList<>(); + } + + public static RentCompany create() { + return new RentCompany(); + } + + public String generateReport() { + StringBuilder report = new StringBuilder(); + for (Car car : cars) { + report.append(car.getName()); + report.append(COLON); + report.append((int) (car.getDistancePerLiter())); + report.append(LITTER); + } + return report.toString(); + } + + public void addCar(Car car) { + cars.add(car); + } + +} diff --git a/src/main/java/rentCompany/domain/Sonata.java b/src/main/java/rentCompany/domain/Sonata.java new file mode 100644 index 00000000..e216030a --- /dev/null +++ b/src/main/java/rentCompany/domain/Sonata.java @@ -0,0 +1,26 @@ +package rentCompany.domain; + +public class Sonata extends Car { + + private static final String CAR_NAME = "Sonata"; + private static final double FUEL_EFFICIENCY = 10; + + public Sonata(int tripDistance) { + super(CAR_NAME, tripDistance); + } + + @Override + double getDistancePerLiter() { + return tripDistance / FUEL_EFFICIENCY; + } + + @Override + double getTripDistance() { + return tripDistance; + } + + @Override + String getName() { + return name; + } +} diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java new file mode 100644 index 00000000..df9a4cd4 --- /dev/null +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -0,0 +1,40 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class DealerTest { + + public static final int ONE = 1; + + @DisplayName("๋”œ๋Ÿฌ๋Š” ์นด๋“œ๋ฅผ ํ•œ ์žฅ์”ฉ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋‹ค") + @Test + void testAllocateCard() { + Dealer dealer = new Dealer(); + Player player = new Player("ํ”Œ๋ ˆ์ด์–ด"); + dealer.allocateCard(player); + assertThat(player.getCards().size()).isEqualTo(ONE); + } + + @DisplayName("์ฒ˜์Œ ๋ฐ›์€ 2์žฅ์˜ ์นด๋“œ ํ•ฉ๊ณ„๊ฐ€ 16์ดํ•˜๋ผ๋ฉด ์นด๋“œ ํ•œ ์žฅ์„ ์ถ”๊ฐ€๋กœ ๋ฐ›๋Š”๋‹ค") + @Test + void testAddOneMoreCard() { + Dealer dealer = new Dealer(); + dealer.receiveCard(new Card(Suit.SPADES, Denomination.FIVE)); + dealer.receiveCard(new Card(Suit.SPADES, Denomination.SIX)); + dealer.addOneMoreCard(); + assertThat(dealer.getCards().size()).isEqualTo(3); + } + + @DisplayName("์ฒ˜์Œ ๋ฐ›์€ 2์žฅ์˜ ์นด๋“œ ํ•ฉ๊ณ„๊ฐ€ 16์ด์ƒ์ด๋ฉด ์นด๋“œ ํ•œ ์žฅ์„ ์ถ”๊ฐ€๋กœ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค") + @Test + void testAddOneMoreCardFail() { + Dealer dealer = new Dealer(); + dealer.receiveCard(new Card(Suit.SPADES, Denomination.NINE)); + dealer.receiveCard(new Card(Suit.SPADES, Denomination.EIGHT)); + dealer.addOneMoreCard(); + assertThat(dealer.getCards().size()).isEqualTo(2); + } +} \ 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..043231c5 --- /dev/null +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -0,0 +1,26 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class DeckTest { + public static final int TOTAL_CARDS_COUNT = 52; + public static final int ONE = 1; + + @DisplayName("๋ฑ์„ ์ƒ์„ฑํ•˜๋ฉด 52๊ฐœ์˜ ์นด๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค") + @Test + void testConstructor() { + Deck deck = new Deck(); + assertThat(deck.getCardsCount()).isEqualTo(TOTAL_CARDS_COUNT); + } + + @DisplayName("์นด๋“œ๋ฅผ ํ•œ ์žฅ์”ฉ ๊บผ๋‚ธ๋‹ค") + @Test + void testPopCard() { + Deck deck = new Deck(); + deck.popCard(); + assertThat(deck.getCardsCount()).isEqualTo(TOTAL_CARDS_COUNT - ONE); + } +} \ No newline at end of file diff --git a/src/test/java/blackjack/domain/DenominationTest.java b/src/test/java/blackjack/domain/DenominationTest.java new file mode 100644 index 00000000..23259599 --- /dev/null +++ b/src/test/java/blackjack/domain/DenominationTest.java @@ -0,0 +1,7 @@ +package blackjack.domain; + +import static org.junit.jupiter.api.Assertions.*; + +class DenominationTest { + +} \ No newline at end of file diff --git a/src/test/java/blackjack/domain/JudgementTest.java b/src/test/java/blackjack/domain/JudgementTest.java new file mode 100644 index 00000000..1e74ea10 --- /dev/null +++ b/src/test/java/blackjack/domain/JudgementTest.java @@ -0,0 +1,41 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class JudgementTest { + + static List players; + static Judgement judgement; + + @BeforeAll + static void setUp() { + Player player1 = new Player("a"); + Player player2 = new Player("b"); + Dealer dealer = new Dealer(); + players = Arrays.asList(player1, player2, dealer); + player1.receiveCard(new Card(Suit.DIAMONDS, Denomination.ACE)); + player1.receiveCard(new Card(Suit.SPADES, Denomination.NINE)); // 20 + player2.receiveCard(new Card(Suit.SPADES, Denomination.FIVE)); + player2.receiveCard(new Card(Suit.CLOVERS, Denomination.SEVEN)); + player2.receiveCard(new Card(Suit.SPADES, Denomination.NINE)); // 21 + dealer.receiveCard(new Card(Suit.SPADES, Denomination.KING)); + dealer.receiveCard(new Card(Suit.SPADES, Denomination.SIX)); // 16 + judgement = new Judgement(players); + } + + @DisplayName("ํ”Œ๋ ˆ์ด์–ด์™€ ๋”œ๋Ÿฌ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ŠนํŒจ๋ฅผ ์ฐพ๋Š”๋‹ค") + @Test + void testFindWinner() { + Map playerResults = judgement.findWinners(); + assertThat(playerResults.get("a")).isEqualTo("์Šน"); + assertThat(playerResults.get("b")).isEqualTo("์Šน"); + assertThat(playerResults.get("๋”œ๋Ÿฌ")).isEqualTo("0์Šน 2ํŒจ"); + } +} diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java new file mode 100644 index 00000000..fe3c4977 --- /dev/null +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -0,0 +1,43 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class PlayerTest { + + @DisplayName("๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ์นด๋“œ์˜ ์ ์ˆ˜๋ฅผ ๋ชจ๋‘ ๊ณ„์‚ฐํ•œ๋‹ค") + @Test + void testCalculateScore() { + Player player = new Player("A"); + player.receiveCard(new Card(Suit.CLOVERS, Denomination.EIGHT)); + player.receiveCard(new Card(Suit.DIAMONDS, Denomination.FIVE)); + int score = player.calculateScore(); + assertThat(score).isEqualTo(13); + } + + @DisplayName("๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ์นด๋“œ๊ฐ€ ACE์ผ ๊ฒฝ์šฐ 21๋ณด๋‹ค ์ž‘๊ณ , 21์— ๊ทผ์ ‘ํ•œ ๊ฒฐ๊ณผ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค. 11๋กœ ๊ณ„์‚ฐํ•  ๊ฒฝ์šฐ") + @Test + void testCalculateScoreWithAceAsEleven() { + Player player = new Player("A"); + player.receiveCard(new Card(Suit.DIAMONDS, Denomination.ACE)); + player.receiveCard(new Card(Suit.SPADES, Denomination.FIVE)); + player.receiveCard(new Card(Suit.CLOVERS, Denomination.FIVE)); + int score = player.calculateScore(); + assertThat(score).isEqualTo(21); + } + + @DisplayName("๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ์นด๋“œ๊ฐ€ ACE์ผ ๊ฒฝ์šฐ 21๋ณด๋‹ค ์ž‘๊ณ , 21์— ๊ทผ์ ‘ํ•œ ๊ฒฐ๊ณผ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค. 1๋กœ ๊ณ„์‚ฐํ•  ๊ฒฝ์šฐ") + @Test + void testCalculateScoreWithAceAsOne() { + Player player = new Player("A"); + player.receiveCard(new Card(Suit.DIAMONDS, Denomination.ACE)); + player.receiveCard(new Card(Suit.SPADES, Denomination.NINE)); + player.receiveCard(new Card(Suit.CLOVERS, Denomination.NINE)); + int score = player.calculateScore(); + assertThat(score).isEqualTo(19); + } + + +} \ No newline at end of file diff --git a/src/test/java/blackjack/domain/SuitTest.java b/src/test/java/blackjack/domain/SuitTest.java new file mode 100644 index 00000000..db663c9b --- /dev/null +++ b/src/test/java/blackjack/domain/SuitTest.java @@ -0,0 +1,7 @@ +package blackjack.domain; + +import static org.junit.jupiter.api.Assertions.*; + +class SuitTest { + +} \ No newline at end of file diff --git a/src/test/java/blackjack/view/InputViewTest.java b/src/test/java/blackjack/view/InputViewTest.java new file mode 100644 index 00000000..35a749c7 --- /dev/null +++ b/src/test/java/blackjack/view/InputViewTest.java @@ -0,0 +1,34 @@ +package blackjack.view; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.Player; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class InputViewTest { + + @DisplayName(",๋กœ ๊ตฌ๋ถ„๋œ ์ด๋ฆ„๋“ค์˜ ๋ฌธ์ž์—ด์„ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค") + @Test + void getPlayersName() { + InputStream inputStream = new ByteArrayInputStream("pobi,jason".getBytes()); + System.setIn(inputStream); + List players = InputView.getPlayersName(); + + assertThat(players).containsExactly("pobi", "jason"); + } + + @DisplayName("y๋ฅผ ์ž…๋ ฅํ•˜๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.") + @Test + void testAskAddCard() { + InputStream inputStream = new ByteArrayInputStream("y".getBytes()); + System.setIn(inputStream); + + boolean yesOrNo = InputView.askAddCard(new Player("pobi")); + assertThat(yesOrNo).isTrue(); + } + +} \ No newline at end of file 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/rentCompany/domain/AvanteTest.java b/src/test/java/rentCompany/domain/AvanteTest.java new file mode 100644 index 00000000..6ccea1c5 --- /dev/null +++ b/src/test/java/rentCompany/domain/AvanteTest.java @@ -0,0 +1,38 @@ +package rentCompany.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class AvanteTest { + + static Car avante; + + @BeforeAll + static void setup() { + avante = new Avante(150); + } + + @DisplayName("๋ฆฌํ„ฐ๋‹น ์ด๋™ ๊ฑฐ๋ฆฌ(์—ฐ๋น„)๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.") + @Test + void testGetDistancePerLiter() { + double given = avante.getDistancePerLiter(); + assertThat(given).isEqualTo(10); + } + + @DisplayName("์—ฌํ–‰ํ•˜๋ ค๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.") + @Test + void testGetTripDistance() { + double given = avante.getTripDistance(); + assertThat(given).isEqualTo(150); + } + + @DisplayName("์ฐจ์ข…์˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜จ๋‹ค.") + @Test + void testGetName() { + String given = avante.getName(); + assertThat(given).isEqualTo("Avante"); + } +} \ No newline at end of file diff --git a/src/test/java/rentCompany/domain/K5Test.java b/src/test/java/rentCompany/domain/K5Test.java new file mode 100644 index 00000000..1b51456b --- /dev/null +++ b/src/test/java/rentCompany/domain/K5Test.java @@ -0,0 +1,38 @@ +package rentCompany.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class K5Test { + + static Car K5; + + @BeforeAll + static void setup() { + K5 = new K5(260); + } + + @DisplayName("๋ฆฌํ„ฐ๋‹น ์ด๋™ ๊ฑฐ๋ฆฌ(์—ฐ๋น„)๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.") + @Test + void testGetDistancePerLiter() { + double given = K5.getDistancePerLiter(); + assertThat(given).isEqualTo(20); + } + + @DisplayName("์—ฌํ–‰ํ•˜๋ ค๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.") + @Test + void testGetTripDistance() { + double given = K5.getTripDistance(); + assertThat(given).isEqualTo(260); + } + + @DisplayName("์ฐจ์ข…์˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜จ๋‹ค.") + @Test + void testGetName() { + String given = K5.getName(); + assertThat(given).isEqualTo("K5"); + } +} \ No newline at end of file diff --git a/src/test/java/rentCompany/domain/RentCompanyTest.java b/src/test/java/rentCompany/domain/RentCompanyTest.java new file mode 100644 index 00000000..4274ab68 --- /dev/null +++ b/src/test/java/rentCompany/domain/RentCompanyTest.java @@ -0,0 +1,29 @@ +package rentCompany.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +class RentCompanyTest { + + private static final String NEWLINE = System.getProperty("line.separator"); + + @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 diff --git a/src/test/java/rentCompany/domain/SonataTest.java b/src/test/java/rentCompany/domain/SonataTest.java new file mode 100644 index 00000000..6b55e8e4 --- /dev/null +++ b/src/test/java/rentCompany/domain/SonataTest.java @@ -0,0 +1,38 @@ +package rentCompany.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class SonataTest { + + static Car sonata; + + @BeforeAll + static void setup() { + sonata = new Sonata(150); + } + + @DisplayName("๋ฆฌํ„ฐ๋‹น ์ด๋™ ๊ฑฐ๋ฆฌ(์—ฐ๋น„)๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.") + @Test + void testGetDistancePerLiter() { + double given = sonata.getDistancePerLiter(); + assertThat(given).isEqualTo(15); + } + + @DisplayName("์—ฌํ–‰ํ•˜๋ ค๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.") + @Test + void testGetTripDistance() { + double given = sonata.getTripDistance(); + assertThat(given).isEqualTo(150); + } + + @DisplayName("์ฐจ์ข…์˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜จ๋‹ค.") + @Test + void testGetName() { + String given = sonata.getName(); + assertThat(given).isEqualTo("Sonata"); + } +} \ No newline at end of file