diff --git a/src/main/java/ladder/Application.java b/src/main/java/ladder/Application.java index a816702e61..7752fd8a51 100644 --- a/src/main/java/ladder/Application.java +++ b/src/main/java/ladder/Application.java @@ -4,23 +4,24 @@ import ladder.view.InputView; import ladder.view.OutputView; -import java.util.HashMap; -import java.util.Map; - public class Application { + private static final String ALL_RESULTS = "all"; public static void main(String[] args) { Players players = Players.of(InputView.askPlayers()); - Prizes prizes = Prizes.from(InputView.askPrizes(), players.numberOfPlayers()); + Prizes prizes = Prizes.from(InputView.askPrizes()); Height height = Height.from(InputView.askHeight()); - Ladder ladder = Ladder.from(players, height); - OutputView.drawLadder(players, ladder, prizes); + GameInfo gameInfo = GameInfo.of(players, prizes); + Ladder ladder = Ladder.from(players.numberOfPlayers(), height); - GameResult gameResult = GameResult.of(players, ladder, prizes); - String wantedPlayer = InputView.askWhichResultWant(); + LadderGame ladderGame = LadderGame.of(gameInfo, ladder); + GameResult gameResult = ladderGame.playGame(); - if ("all".equals(wantedPlayer)) { + OutputView.printGame(ladderGame); + + String wantedPlayer = InputView.askWhichResultWant(); + if (ALL_RESULTS.equals(wantedPlayer)) { OutputView.printAllResult(gameResult); return; } diff --git a/src/main/java/ladder/domain/Bar.java b/src/main/java/ladder/domain/Bar.java deleted file mode 100644 index 108781fc79..0000000000 --- a/src/main/java/ladder/domain/Bar.java +++ /dev/null @@ -1,18 +0,0 @@ -package ladder.domain; - -public class Bar { - - private final boolean bar; - - private Bar(boolean bar) { - this.bar = bar; - } - - public static Bar from(boolean doesBarExist) { - return new Bar(doesBarExist); - } - - public boolean isExist() { - return bar; - } -} diff --git a/src/main/java/ladder/domain/BarGenerator.java b/src/main/java/ladder/domain/BarGenerator.java deleted file mode 100644 index 76e97a5c55..0000000000 --- a/src/main/java/ladder/domain/BarGenerator.java +++ /dev/null @@ -1,7 +0,0 @@ -package ladder.domain; - -@FunctionalInterface -public interface BarGenerator { - - boolean generateBar(); -} diff --git a/src/main/java/ladder/domain/Direction.java b/src/main/java/ladder/domain/Direction.java new file mode 100644 index 0000000000..2f065364d4 --- /dev/null +++ b/src/main/java/ladder/domain/Direction.java @@ -0,0 +1,30 @@ +package ladder.domain; + +public enum Direction { + + LEFT(true, false), + RIGHT(false, true), + PASS(false, false); + + private boolean left; + private boolean right; + + Direction(boolean left, boolean right) { + this.left = left; + this.right = right; + } + + public boolean isRight() { + return right; + } + + public Position move(Position position) { + if (left && !right) { + return position.moveToLeft(); + } + if (!left && right) { + return position.moveToRight(); + } + return position; + } +} diff --git a/src/main/java/ladder/domain/GameInfo.java b/src/main/java/ladder/domain/GameInfo.java new file mode 100644 index 0000000000..045711821e --- /dev/null +++ b/src/main/java/ladder/domain/GameInfo.java @@ -0,0 +1,44 @@ +package ladder.domain; + +public class GameInfo { + static final String ALERT_INVALID_NUMBER_OF_PRIZES = "상품의 수는 참여자 수와 같아야 합니다."; + + private final Players players; + private final Prizes prizes; + + private GameInfo(Players players, Prizes prizes) { + validationPrizes(players, prizes); + this.players = players; + this.prizes = prizes; + } + + public static GameInfo of(Players players, Prizes prizes) { + return new GameInfo(players, prizes); + } + + private void validationPrizes(Players players, Prizes prizes) { + if (players.numberOfPlayers() != prizes.numberOfPrizes()) { + throw new IllegalArgumentException(ALERT_INVALID_NUMBER_OF_PRIZES); + } + } + + Player findPlayerByIndex(int index) { + return players.findPlayerByIndex(index); + } + + Prize findPrizeByPosition(Position finalPosition) { + return prizes.findPrizeByPosition(finalPosition); + } + + int numberOfPlayers() { + return players.numberOfPlayers(); + } + + public Players getPlayers() { + return players; + } + + public Prizes getPrizes() { + return prizes; + } +} diff --git a/src/main/java/ladder/domain/GameResult.java b/src/main/java/ladder/domain/GameResult.java index 6d491a9910..fb7b4c5d69 100644 --- a/src/main/java/ladder/domain/GameResult.java +++ b/src/main/java/ladder/domain/GameResult.java @@ -13,22 +13,8 @@ private GameResult(Map resultMap) { this.resultMap = new HashMap<>(resultMap); } - public static GameResult of(Players players, Ladder ladder, Prizes prizes) { - return new GameResult(playGame(players, ladder, prizes)); - } - - private static Map playGame(Players players, Ladder ladder, Prizes prizes) { - Map resultMap = new HashMap<>(); - int numberOfPlayers = players.numberOfPlayers(); - - for (int i = 0; i < numberOfPlayers; i++) { - Player player = players.getPlayers().get(i); - Position finalPosition = ladder.goThroughLinesFrom(Position.from(i)); - Prize prize = prizes.getPrizes().get(finalPosition.getPosition()); - - resultMap.put(player, prize); - } - return resultMap; + public static GameResult from(Map resultMap) { + return new GameResult(resultMap); } public String findResult(String wantedPlayer) { diff --git a/src/main/java/ladder/domain/Ladder.java b/src/main/java/ladder/domain/Ladder.java index b3072477a1..bb708dabaf 100644 --- a/src/main/java/ladder/domain/Ladder.java +++ b/src/main/java/ladder/domain/Ladder.java @@ -14,10 +14,10 @@ private Ladder(List lines) { this.lines = new ArrayList<>(lines); } - public static Ladder from(Players players, Height height) { + public static Ladder from(int numberOfPlayers, Height height) { return new Ladder(IntStream .range(0, height.getHeight()) - .mapToObj((integer) -> Line.from(players.numberOfPlayers())) + .mapToObj((integer) -> Line.from(numberOfPlayers)) .collect(Collectors.toList())); } diff --git a/src/main/java/ladder/domain/LadderGame.java b/src/main/java/ladder/domain/LadderGame.java new file mode 100644 index 0000000000..8d3f8a4970 --- /dev/null +++ b/src/main/java/ladder/domain/LadderGame.java @@ -0,0 +1,45 @@ +package ladder.domain; + +import java.util.HashMap; +import java.util.Map; + +public class LadderGame { + + private final GameInfo gameInfo; + private final Ladder ladder; + + private LadderGame(GameInfo gameInfo, Ladder ladder) { + this.gameInfo = gameInfo; + this.ladder = ladder; + } + + public static LadderGame of(GameInfo gameInfo, Ladder ladder) { + return new LadderGame(gameInfo, ladder); + } + + public GameResult playGame() { + Map resultMap = new HashMap<>(); + int numberOfPlayers = gameInfo.numberOfPlayers(); + + for (int index = 0; index < numberOfPlayers; index++) { + Player player = gameInfo.findPlayerByIndex(index); + Position finalPosition = ladder.goThroughLinesFrom(Position.from(index)); + Prize prize = gameInfo.findPrizeByPosition(finalPosition); + + resultMap.put(player, prize); + } + return GameResult.from(resultMap); + } + + public Players getPlayers() { + return gameInfo.getPlayers(); + } + + public Prizes getPrizes() { + return gameInfo.getPrizes(); + } + + public Ladder getLadder() { + return ladder; + } +} diff --git a/src/main/java/ladder/domain/Line.java b/src/main/java/ladder/domain/Line.java index edb0f5dd9d..1c4bb7e610 100644 --- a/src/main/java/ladder/domain/Line.java +++ b/src/main/java/ladder/domain/Line.java @@ -6,29 +6,22 @@ public class Line { - private List bars; + private List points; - Line(List bars) { - this.bars = new ArrayList<>(bars); + Line(List points) { + this.points = new ArrayList<>(points); } public static Line from(int numberOfPlayers) { LineMaker lineMaker = new LineMaker(); - return new Line(lineMaker.generateBars(numberOfPlayers)); - } - - public List getBars() { - return Collections.unmodifiableList(bars); + return new Line(lineMaker.generatePoints(numberOfPlayers)); } Position travel(Position position) { - if (bars.get(position.getPosition()).isExist()) { //사용자의 현재 위치와 bar의 위치가 같으면 사용자의 현재위치가 1만큼 증가 - return position.moveToRight(); - } - if (position.getPosition() > 0 && bars.get(position.getLeftPosition()).isExist()) { //사용자의 현재 위치보다 bar의 위치가 1만큼 작으면 사용자의 현재위치는 1만큼 감소 - return position.moveToLeft(); - } - return position; - } //TODO: 이 로직을 Bar 객체로 위임하고 싶은데, Bar 2개를 사용해서 위치를 갱신하는 방식이라 이 곳에서 처리하는 상태 + return points.get(position.getPosition()).move(position); + } -} + public List getPoints() { + return Collections.unmodifiableList(points); + } +} \ No newline at end of file diff --git a/src/main/java/ladder/domain/LineMaker.java b/src/main/java/ladder/domain/LineMaker.java index f03ed11c79..42fbbbd89c 100644 --- a/src/main/java/ladder/domain/LineMaker.java +++ b/src/main/java/ladder/domain/LineMaker.java @@ -4,40 +4,50 @@ import java.util.List; class LineMaker { - private static final int NUMBER_OF_FIRST_AND_LAST_BAR = 2; + private static final int NUMBER_OF_FIRST_AND_LAST_POINT = 2; - private List randomBars; - private RandomBarGenerator barGenerator = new RandomBarGenerator(); + private List randomPoints; + private RandomPointGenerator pointGenerator = new RandomPointGenerator(); - List generateBars(int numberOfPlayers) { - this.randomBars = new ArrayList<>(); - generateFirstBar(); - generateMiddleBars(numberOfPlayers); - generateLastBar(); - return randomBars; + List generatePoints(int numberOfPlayers) { + this.randomPoints = new ArrayList<>(); + generateFirstPoint(); + generateMiddlePoints(numberOfPlayers); + generateLastPoint(); + return randomPoints; } - private void generateFirstBar() { - randomBars.add(Bar.from(barGenerator.generateBar())); + private void generateFirstPoint() { + randomPoints.add(Point.makeFirstPoint(chooseDirection())); } - private void generateMiddleBars(int numberOfPlayers) { - int spaceForMiddleBars = numberOfPlayers - NUMBER_OF_FIRST_AND_LAST_BAR; - for (int i = 0; i < spaceForMiddleBars; i++) { - Bar previousBar = randomBars.get(i); - addNextBar(previousBar); + private void generateMiddlePoints(int numberOfPlayers) { + int spaceForMiddlePoints = numberOfPlayers - NUMBER_OF_FIRST_AND_LAST_POINT; + for (int i = 0; i < spaceForMiddlePoints; i++) { + Point previousPoint = randomPoints.get(i); + addNextPoint(previousPoint); } } - private void addNextBar(Bar previousBar) { - if (previousBar.isExist()) { - generateLastBar(); + private void addNextPoint(Point previousPoint) { + if (previousPoint.isDirectionRight()) { + randomPoints.add(previousPoint.makeNextPoint(Direction.LEFT)); return; } - randomBars.add(Bar.from(barGenerator.generateBar())); + randomPoints.add(previousPoint.makeNextPoint(chooseDirection())); } - private void generateLastBar() { - randomBars.add(Bar.from(Boolean.FALSE)); + private void generateLastPoint() { + int currentlyLastIndex = randomPoints.size() - 1; + Point secondToLastPoint = randomPoints.get(currentlyLastIndex); + randomPoints.add(secondToLastPoint.makeLastPoint()); + } + + private Direction chooseDirection() { + Direction direction = Direction.PASS; + if (pointGenerator.generatePoint()) { + direction = Direction.RIGHT; + } + return direction; } } diff --git a/src/main/java/ladder/domain/Players.java b/src/main/java/ladder/domain/Players.java index c0d8ae6d52..7996bda8f2 100644 --- a/src/main/java/ladder/domain/Players.java +++ b/src/main/java/ladder/domain/Players.java @@ -35,6 +35,10 @@ public int numberOfPlayers() { return players.size(); } + Player findPlayerByIndex(int index) { + return players.get(index); + } + public List getPlayers() { return Collections.unmodifiableList(players); } diff --git a/src/main/java/ladder/domain/Point.java b/src/main/java/ladder/domain/Point.java new file mode 100644 index 0000000000..9cf79393f4 --- /dev/null +++ b/src/main/java/ladder/domain/Point.java @@ -0,0 +1,73 @@ +package ladder.domain; + +import java.util.Objects; + +public class Point { + + static final int FIRST_INDEX = 0; + private final Position index; + private final Direction direction; + + private Point(Position index, Direction direction) { + this.index = index; + this.direction = direction; + } + + public static Point of(Position index, Direction direction) { + return new Point(index, direction); + } + + static Point makeFirstPoint(Direction direction) { + return new Point(Position.from(FIRST_INDEX), direction); + } + + Point makeNextPoint(Direction direction) { + return new Point(index.moveToRight(), direction); + } + + Point makeLastPoint() { + Direction lastPointDirection = Direction.PASS; + if (this.direction == Direction.RIGHT) { + lastPointDirection = Direction.LEFT; + } + return new Point(index.moveToRight(), lastPointDirection); + } + + Position move(Position position) { + return direction.move(position); + } + + public boolean isDirectionRight() { + return direction.isRight(); + } + + Position getIndex() { + return index; + } + + Direction getDirection() { + return direction; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Point point = (Point) o; + return Objects.equals(index, point.index) && + direction == point.direction; + } + + @Override + public int hashCode() { + return Objects.hash(index, direction); + } + + @Override + public String toString() { + return "Point{" + + "index=" + index + + ", direction=" + direction + + '}'; + } +} diff --git a/src/main/java/ladder/domain/PointIndicator.java b/src/main/java/ladder/domain/PointIndicator.java new file mode 100644 index 0000000000..8d72b98496 --- /dev/null +++ b/src/main/java/ladder/domain/PointIndicator.java @@ -0,0 +1,7 @@ +package ladder.domain; + +@FunctionalInterface +public interface PointIndicator { + + boolean generatePoint(); +} diff --git a/src/main/java/ladder/domain/Position.java b/src/main/java/ladder/domain/Position.java index f9bda7ff3a..b8fa650a23 100644 --- a/src/main/java/ladder/domain/Position.java +++ b/src/main/java/ladder/domain/Position.java @@ -1,10 +1,13 @@ package ladder.domain; -public class Position { +import java.util.Objects; - private static final int MOVE_ONE_STEP_TO_RIGHT = 1; - private static final int MOVE_ONE_STEP_TO_LEFT = -1; +public class Position { + static final int MOVE_ONE_STEP_TO_RIGHT = 1; + static final int MOVE_ONE_STEP_TO_LEFT = -1; static final String ALERT_UNMOVABLE_TO_LEFT = "더 이상 왼쪽으로 이동할 수 없습니다."; + private static final int FIRST_POSITION = 0; + private int position; private Position(int currentPosition) { @@ -37,13 +40,26 @@ int getLeftPosition() { return this.position + MOVE_ONE_STEP_TO_LEFT; } + boolean unmovableToLeft() { + return position <= FIRST_POSITION; + } + private void validationMovableToLeft() { if (unmovableToLeft()) { throw new IllegalArgumentException(ALERT_UNMOVABLE_TO_LEFT); } } - private boolean unmovableToLeft() { - return position <= 0; + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Position position1 = (Position) o; + return position == position1.position; + } + + @Override + public int hashCode() { + return Objects.hash(position); } } diff --git a/src/main/java/ladder/domain/Prizes.java b/src/main/java/ladder/domain/Prizes.java index 80fa052f2e..a6cd4a27d4 100644 --- a/src/main/java/ladder/domain/Prizes.java +++ b/src/main/java/ladder/domain/Prizes.java @@ -7,28 +7,28 @@ import java.util.stream.Collectors; public class Prizes { - static final String ALERT_INVALID_NUMBER_OF_PRIZES = "상품의 수는 참여자 수와 같아야 합니다."; private static final String PRIZE_SEPARATOR = ","; private final List prizes; - private Prizes(List prizes, int numberOfPlayers) { - validationPrizes(prizes, numberOfPlayers); + private Prizes(List prizes) { this.prizes = new ArrayList<>(prizes); } - public static Prizes from(String inputPrizes, int numberOfPlayers) { + public static Prizes from(String inputPrizes) { return new Prizes(Arrays .stream(inputPrizes.split(PRIZE_SEPARATOR)) .map(String::trim) .map(Prize::from) - .collect(Collectors.toList()), numberOfPlayers); + .collect(Collectors.toList())); } - private void validationPrizes(List prizes, int numberOfPlayers) { - if (prizes.size() != numberOfPlayers) { - throw new IllegalArgumentException(ALERT_INVALID_NUMBER_OF_PRIZES); - } + Prize findPrizeByPosition(Position position) { + return prizes.get(position.getPosition()); + } + + int numberOfPrizes() { + return prizes.size(); } public List getPrizes() { diff --git a/src/main/java/ladder/domain/RandomBarGenerator.java b/src/main/java/ladder/domain/RandomPointGenerator.java similarity index 60% rename from src/main/java/ladder/domain/RandomBarGenerator.java rename to src/main/java/ladder/domain/RandomPointGenerator.java index fcf5793da1..aff8a091a5 100644 --- a/src/main/java/ladder/domain/RandomBarGenerator.java +++ b/src/main/java/ladder/domain/RandomPointGenerator.java @@ -2,12 +2,12 @@ import java.util.Random; -public class RandomBarGenerator implements BarGenerator { +public class RandomPointIndicator implements PointIndicator { private Random random = new Random(); @Override - public boolean generateBar() { + public boolean generatePoint() { return random.nextBoolean(); } } diff --git a/src/main/java/ladder/formatter/NameFormatter.java b/src/main/java/ladder/formatter/NameFormatter.java deleted file mode 100644 index a735975736..0000000000 --- a/src/main/java/ladder/formatter/NameFormatter.java +++ /dev/null @@ -1,8 +0,0 @@ -package ladder.formatter; - -public interface NameFormatter { - int SPACE_FOR_NAME = 5; - String BLANK_TO_FILL_THE_NAME_SPACE = " "; //TODO: 질문입니다. 인터페이스에 이런 상수들을 둬도 되는건지 궁금합니다. - - String nameFormat(T object); -} diff --git a/src/main/java/ladder/formatter/PlayerNameFormatter.java b/src/main/java/ladder/formatter/PlayerNameFormatter.java deleted file mode 100644 index 80f6c1feab..0000000000 --- a/src/main/java/ladder/formatter/PlayerNameFormatter.java +++ /dev/null @@ -1,20 +0,0 @@ -package ladder.formatter; - -import ladder.domain.Player; - -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -public class PlayerNameFormatter implements NameFormatter { - - @Override - public String nameFormat(Player player) { - String name = player.getName(); - int spaceForBlank = SPACE_FOR_NAME - name.length(); - - return IntStream.rangeClosed(0, spaceForBlank) - .mapToObj((integer) -> BLANK_TO_FILL_THE_NAME_SPACE) - .collect(Collectors.joining()) - .concat(name); - } -} diff --git a/src/main/java/ladder/formatter/PlayersPrintFormatter.java b/src/main/java/ladder/formatter/PlayersPrintFormatter.java index 3fc9a2c2e9..a88fd40c08 100644 --- a/src/main/java/ladder/formatter/PlayersPrintFormatter.java +++ b/src/main/java/ladder/formatter/PlayersPrintFormatter.java @@ -1,18 +1,15 @@ package ladder.formatter; -import ladder.domain.Player; import ladder.domain.Players; import java.util.stream.Collectors; public class PlayersPrintFormatter implements DataPrintFormatter { - private final NameFormatter playerNameFormatter = new PlayerNameFormatter(); - @Override public String dataPrintFormat(Players players) { return players.getPlayers().stream() - .map(player -> String.format(playerNameFormatter.nameFormat(player), player.getName())) + .map(player -> String.format("%6s", player.getName())) .collect(Collectors.joining()); } } diff --git a/src/main/java/ladder/formatter/PrizeNameFormatter.java b/src/main/java/ladder/formatter/PrizeNameFormatter.java deleted file mode 100644 index 6d47681095..0000000000 --- a/src/main/java/ladder/formatter/PrizeNameFormatter.java +++ /dev/null @@ -1,20 +0,0 @@ -package ladder.formatter; - -import ladder.domain.Prize; - -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -public class PrizeNameFormatter implements NameFormatter { - - @Override - public String nameFormat(Prize prize) { - String name = prize.getPrize(); - int spaceForBlank = SPACE_FOR_NAME - name.length(); - - return IntStream.rangeClosed(0, spaceForBlank) - .mapToObj((integer) -> BLANK_TO_FILL_THE_NAME_SPACE) - .collect(Collectors.joining()) - .concat(name); - } -} diff --git a/src/main/java/ladder/formatter/PrizesPrintFormatter.java b/src/main/java/ladder/formatter/PrizesPrintFormatter.java index 49fe3fdef7..ed7d437321 100644 --- a/src/main/java/ladder/formatter/PrizesPrintFormatter.java +++ b/src/main/java/ladder/formatter/PrizesPrintFormatter.java @@ -1,18 +1,15 @@ package ladder.formatter; -import ladder.domain.Prize; import ladder.domain.Prizes; import java.util.stream.Collectors; public class PrizesPrintFormatter implements DataPrintFormatter { - private final NameFormatter prizeNameFormatter = new PrizeNameFormatter(); - @Override public String dataPrintFormat(Prizes prizes) { return prizes.getPrizes().stream() - .map(prize -> String.format(prizeNameFormatter.nameFormat(prize), prize.getPrize())) + .map(prize -> String.format("%6s", prize.getPrize())) .collect(Collectors.joining()); } } diff --git a/src/main/java/ladder/view/OutputView.java b/src/main/java/ladder/view/OutputView.java index 73b4ae4c01..7c7c78f136 100644 --- a/src/main/java/ladder/view/OutputView.java +++ b/src/main/java/ladder/view/OutputView.java @@ -13,11 +13,11 @@ public class OutputView { private static DataPrintFormatter playersPrintFormatter = new PlayersPrintFormatter(); private static DataPrintFormatter prizesPrintFormatter = new PrizesPrintFormatter(); - public static void drawLadder(Players players, Ladder ladder, Prizes prizes) { + public static void printGame(LadderGame ladderGame) { printResultTitle(); - printPlayers(players); - printLadder(ladder); - printPrizes(prizes); + printPlayers(ladderGame.getPlayers()); + printLadder(ladderGame.getLadder()); + printPrizes(ladderGame.getPrizes()); } private static void printResultTitle() { @@ -40,16 +40,16 @@ private static void printLadder(Ladder ladder) { private static void printLine(Line line) { System.out.print(EMPTY_SPACE); - line.getBars().stream() - .map(OutputView::printBars) + line.getPoints().stream() + .map(OutputView::printPoints) .forEach(System.out::print); printEmptyLine(); } - private static String printBars(Bar bar) { + private static String printPoints(Point point) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(COLUMN); - if (bar.isExist()) { + if (point.isDirectionRight()) { return stringBuilder.append(BAR).toString(); } return stringBuilder.append(EMPTY_SPACE).toString(); diff --git a/src/test/java/ladder/domain/BarTest.java b/src/test/java/ladder/domain/BarTest.java deleted file mode 100644 index 15e57c2008..0000000000 --- a/src/test/java/ladder/domain/BarTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package ladder.domain; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class BarTest { - @Test - void 사다리_기둥_사이를_잇는_Bar를_생성한다() { - boolean doesBarExist = true; - Bar bar = Bar.from(doesBarExist); - - assertThat(bar.isExist()).isTrue(); - } -} diff --git a/src/test/java/ladder/domain/GameInfoTest.java b/src/test/java/ladder/domain/GameInfoTest.java new file mode 100644 index 0000000000..6374dbf681 --- /dev/null +++ b/src/test/java/ladder/domain/GameInfoTest.java @@ -0,0 +1,20 @@ +package ladder.domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +public class GameInfoTest { + @Test + void 플레이어_수와_결과의_수가_같지_않으면_예외가_발생한다() { + String inputPlayers = "1,2,3,4"; + String inputResults = "일,이,삼,사,오"; + Prizes prizes = Prizes.from(inputResults); + Players players = Players.of(inputPlayers); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> { + GameInfo.of(players, prizes); + }).withMessage(GameInfo.ALERT_INVALID_NUMBER_OF_PRIZES); + } +} diff --git a/src/test/java/ladder/domain/LadderTest.java b/src/test/java/ladder/domain/LadderTest.java index 88ab800c08..bf5204c8d3 100644 --- a/src/test/java/ladder/domain/LadderTest.java +++ b/src/test/java/ladder/domain/LadderTest.java @@ -8,7 +8,8 @@ public class LadderTest { @Test void 입력된_사다리의_높이만큼_Line을_생성하여_사다리를_만든다() { int inputHeight = 5; - Ladder ladder = Ladder.from(Players.of("test1,test2,test3"), Height.from(inputHeight)); + int numberOfPlayers = 5; + Ladder ladder = Ladder.from(numberOfPlayers, Height.from(inputHeight)); assertThat(ladder.getLines().size()).isEqualTo(inputHeight); } diff --git a/src/test/java/ladder/domain/LineTest.java b/src/test/java/ladder/domain/LineTest.java index 029f5092cf..cc0cd47c76 100644 --- a/src/test/java/ladder/domain/LineTest.java +++ b/src/test/java/ladder/domain/LineTest.java @@ -1,6 +1,8 @@ package ladder.domain; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import java.util.Arrays; @@ -9,55 +11,27 @@ public class LineTest { @Test - void 플레이어_수_만큼_바를_랜덤으로_생성한다() { + void 플레이어_수_만큼_포인트를_랜덤으로_생성한다() { int numberOfPlayers = 5; Line line = Line.from(numberOfPlayers); - assertThat(line.getBars().size()).isEqualTo(numberOfPlayers); + assertThat(line.getPoints().size()).isEqualTo(numberOfPlayers); } - @Test - void 플레이어의_위치와_Bar의_위치가_같으면_플레이어의_위치를_1만큼_증가시킨다() { - Line line = new Line(Arrays.asList(Bar.from(false), Bar.from(true), Bar.from(false))); - - int currentPosition = 1; - Position playerPosition = Position.from(currentPosition); - - assertThat(line.travel(playerPosition).getPosition()) - .isEqualTo(currentPosition + 1); - } - - @Test - void 플레이어의_위치보다_Bar의_위치가_1만큼_작으면_플레이어의_위치를_1만큼_감소시킨다() { - Line line = new Line(Arrays.asList(Bar.from(false), Bar.from(true), Bar.from(false))); - - int currentPosition = 2; - Position playerPosition = Position.from(currentPosition); - - assertThat(line.travel(playerPosition).getPosition()) - .isEqualTo(currentPosition - 1); + @ParameterizedTest + @CsvSource({"0, 1", "1, 0"}) + void 플레이어의_위치를_변경한다(int currentPosition, int expectedPosition) { + //given + Position initialPosition = Position.from(currentPosition); + Point firstPoint = Point.makeFirstPoint(Direction.RIGHT); + Point middlePoint = Point.of(Position.from(1), Direction.LEFT); + Point lastPoint = Point.of(Position.from(2), Direction.PASS); + Line line = new Line(Arrays.asList(firstPoint, middlePoint, lastPoint)); + + //when + Position movedPosition = line.travel(initialPosition); + + //then + assertThat(movedPosition.getPosition()).isEqualTo(expectedPosition); } - - @Test - void 플레이어의_위치보다_Bar의_위치가_1만큼_크면_플레이어의_위치는_바뀌지_않는다() { - Line line = new Line(Arrays.asList(Bar.from(false), Bar.from(true), Bar.from(false))); - - int currentPosition = 0; - Position playerPosition = Position.from(currentPosition); - - assertThat(line.travel(playerPosition).getPosition()) - .isEqualTo(currentPosition); - } - - @Test - void 플레이어의_위치와_Bar의_위치가_2이상_차이나면_플레이어의_위치는_바뀌지_않는다() { - Line line = new Line(Arrays.asList(Bar.from(true), Bar.from(false), Bar.from(false))); - - int currentPosition = 2; - Position playerPosition = Position.from(currentPosition); - - assertThat(line.travel(playerPosition).getPosition()) - .isEqualTo(currentPosition); - } - } diff --git a/src/test/java/ladder/domain/PointTest.java b/src/test/java/ladder/domain/PointTest.java new file mode 100644 index 0000000000..f3cc05d217 --- /dev/null +++ b/src/test/java/ladder/domain/PointTest.java @@ -0,0 +1,50 @@ +package ladder.domain; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +public class PointTest { + + @ParameterizedTest + @CsvSource({"1, LEFT", "2, RIGHT", "3, PASS"}) + void 위치와_연결방향을_가진_포인트를_생성한다(int index, Direction direction) { + Point point = Point.of(Position.from(index), direction); + + assertAll( + () -> assertThat(point.getIndex().getPosition()).isEqualTo(index), + () -> assertThat(point.getDirection()).isEqualTo(direction) + ); + } + + @ParameterizedTest + @CsvSource({"RIGHT", "PASS"}) + void 첫번째_위치의_포인트를_생성한다(Direction direction) { + Point firstPoint = Point.makeFirstPoint(direction); + Position position = Position.from(Point.FIRST_INDEX); + + assertThat(firstPoint).isEqualTo(Point.of(position, direction)); + } + + @Test + void 다음_위치의_포인트를_생성한다() { + Point currentPoint = Point.makeFirstPoint(Direction.PASS); + Point nextPoint = currentPoint.makeNextPoint(Direction.RIGHT); + + Position nextPosition = Position.from(Point.FIRST_INDEX + 1); + + assertThat(nextPoint).isEqualTo(Point.of(nextPosition, Direction.RIGHT)); + } + + @ParameterizedTest + @CsvSource({"RIGHT, LEFT", "LEFT, PASS", "PASS, PASS"}) + void 마지막_위치의_포인트를_생성한다(Direction currentDirection, Direction lastPointDirection) { + Point currentPoint = Point.of(Position.from(2), currentDirection); + Point lastPoint = currentPoint.makeLastPoint(); + + assertThat(lastPoint).isEqualTo(Point.of(Position.from(3), lastPointDirection)); + } +} diff --git a/src/test/java/ladder/domain/PrizesTest.java b/src/test/java/ladder/domain/PrizesTest.java index 6635ab5f59..bfeaf9da94 100644 --- a/src/test/java/ladder/domain/PrizesTest.java +++ b/src/test/java/ladder/domain/PrizesTest.java @@ -1,28 +1,18 @@ package ladder.domain; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; public class PrizesTest { - @Test - void 입력된_각_사다리의_결과들로_Results를_생성한다() { - int numberOfPlayers = 4; - String inputPrizes = "꽝,5000,꽝,5000"; - Prizes prizes = Prizes.from(inputPrizes, numberOfPlayers); - - assertThat(prizes.getPrizes().size()).isEqualTo(numberOfPlayers); - } - @Test - void 플레이어_수와_결과의_수가_같지_않으면_예외가_발생한다() { - int numberOfPlayers = 4; - String inputResults = "꽝,꽝,꽝,꽝,당첨"; + @ParameterizedTest + @CsvSource({"0, 꽝", "1, 5000", "2, 꽝", "3, 5000"}) + void 입력된_각_사다리의_결과들로_Results를_생성한다(int index, String prize) { + String inputPrizes = "꽝,5000,꽝,5000"; + Prizes prizes = Prizes.from(inputPrizes); - assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> { - Prizes.from(inputResults, numberOfPlayers); - }).withMessage(Prizes.ALERT_INVALID_NUMBER_OF_PRIZES); + assertThat(prizes.getPrizes().get(index).getPrize()).isEqualTo(prize); } }