diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java index c223424de8..791a36a6c2 100644 --- a/src/main/java/domain/Ladder.java +++ b/src/main/java/domain/Ladder.java @@ -1,41 +1,40 @@ package domain; import com.google.common.base.Preconditions; -import domain.dto.GamerDTO; -import domain.dto.LadderLayerDTO; - -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; +import domain.ladder.LadderLayer; +import domain.ladder.LadderLayers; +import domain.point.LadderPoints; /** * Created by hspark on 16/11/2018. */ public class Ladder { public static final int MIN_LADDER_HEIGHT = 1; - public static final int NUMBER_TO_GET_WIDTH = 1; + public static final int MIN_LADDER_WIDTH = 0; - private List gamers; - private List ladderLines; + private LadderPoints ladderPoints; + private LadderLayers ladderLayers; - public Ladder(List gamerNameList, int height, LadderLineSupplier supplier) { - Preconditions.checkArgument(height > MIN_LADDER_HEIGHT, "사다리 높이가 너무 낮습니다."); - this.gamers = gamerNameList.stream().map(Gamer::new).collect(Collectors.toList()); - this.ladderLines = Stream.iterate(0, i -> i + 1).limit(height) - .map(integer -> new LadderLayer(getWidth(), supplier)).collect(Collectors.toList()); + public Ladder(int gamerCount) { + Preconditions.checkArgument(gamerCount >= MIN_LADDER_WIDTH, "게이머 수가 너무 적습니다."); + this.ladderPoints = new LadderPoints(gamerCount); } - public void drawLadder() { - ladderLines.stream().forEach(LadderLayer::drawLines); + public void drawLadder(int height, LadderLineSupplier supplier) { + Preconditions.checkArgument(height > MIN_LADDER_HEIGHT, "사다리 높이가 너무 낮습니다."); + this.ladderLayers = new LadderLayers(height, ladderPoints.getWidth()); + ladderLayers.drawAllLadders(supplier); } public LadderResult getLadderGameResult() { - List lineDTOList = ladderLines.stream().map(LadderLayer::getLadderLineDTO).collect(Collectors.toList()); - List gamerDTOList = gamers.stream().map(GamerDTO::of).collect(Collectors.toList()); - return new LadderResult(gamerDTOList, lineDTOList); + return new LadderResult(ladderPoints, ladderLayers); } - private int getWidth() { - return gamers.size() - NUMBER_TO_GET_WIDTH; + public void moveAll() { + int layerNumber = 0; + while (!ladderLayers.isBottomLayer(layerNumber)) { + LadderLayer ladderLayer = ladderLayers.getLayer(layerNumber++); + ladderPoints.moveAll(ladderLayer); + } } } diff --git a/src/main/java/domain/LadderGameInfo.java b/src/main/java/domain/LadderGameInfo.java new file mode 100644 index 0000000000..8f1098f31f --- /dev/null +++ b/src/main/java/domain/LadderGameInfo.java @@ -0,0 +1,36 @@ +package domain; + +import domain.gamer.Gamers; +import domain.point.Point; +import domain.reward.Reward; +import domain.reward.Rewards; + +/** + * Created by hspark on 18/11/2018. + */ +public class LadderGameInfo { + public static final String ALL_GAMER = "all"; + private Gamers gamers; + private Rewards rewards; + + public LadderGameInfo(Gamers gamers, Rewards rewards) { + this.gamers = gamers; + this.rewards = rewards; + } + + public Gamers getGamers() { + return gamers; + } + + public Rewards getRewards() { + return rewards; + } + + public Point findStartPointByGamerName(String gamerName) { + return gamers.findByGamerName(gamerName).getPoint(); + } + + public Reward getRewardByPoint(Point point) { + return rewards.getRewardByPoint(point); + } +} diff --git a/src/main/java/domain/LadderLayer.java b/src/main/java/domain/LadderLayer.java deleted file mode 100644 index e33de0fb5d..0000000000 --- a/src/main/java/domain/LadderLayer.java +++ /dev/null @@ -1,41 +0,0 @@ -package domain; - -import com.google.common.base.Preconditions; -import domain.dto.LadderLayerDTO; -import domain.dto.LineDTO; - -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * Created by hspark on 16/11/2018. - */ -public class LadderLayer { - public static final int MIN_LADDER_WIDTH = 0; - - private List ladderLines; - private LadderLineSupplier supplier; - - public LadderLayer(int width, LadderLineSupplier supplier) { - Preconditions.checkArgument(width >= MIN_LADDER_WIDTH, "너비는 0 이상이어야 합니다."); - this.ladderLines = Stream.iterate(0, i -> i + 1).limit(width) - .map(i -> new LadderLine()).collect(Collectors.toList()); - this.supplier = supplier; - } - - public LadderLayerDTO getLadderLineDTO() { - List lineDTOS = ladderLines.stream().map(LineDTO::of).collect(Collectors.toList()); - return new LadderLayerDTO(Collections.unmodifiableList(lineDTOS)); - } - - public void drawLines() { - ladderLines.stream().reduce(new LadderLine(), this::drawLine); - } - - private LadderLine drawLine(LadderLine previousLadderLine, LadderLine ladderLine) { - ladderLine.draw(previousLadderLine, supplier); - return ladderLine; - } -} diff --git a/src/main/java/domain/LadderLine.java b/src/main/java/domain/LadderLine.java deleted file mode 100644 index 77a4eee375..0000000000 --- a/src/main/java/domain/LadderLine.java +++ /dev/null @@ -1,17 +0,0 @@ -package domain; - -/** - * Created by hspark on 16/11/2018. - */ -public class LadderLine { - private boolean drawn; - - public void draw(LadderLine previousLadderLine, LadderLineSupplier supplier) { - this.drawn = supplier.get() && !previousLadderLine.isDrawn(); - - } - - public boolean isDrawn() { - return drawn; - } -} diff --git a/src/main/java/domain/LadderResult.java b/src/main/java/domain/LadderResult.java index c0d9d2a314..4d1874490d 100644 --- a/src/main/java/domain/LadderResult.java +++ b/src/main/java/domain/LadderResult.java @@ -1,7 +1,9 @@ package domain; -import domain.dto.GamerDTO; -import domain.dto.LadderLayerDTO; +import domain.ladder.LadderLayer; +import domain.ladder.LadderLayers; +import domain.point.Point; +import domain.point.LadderPoints; import java.util.List; @@ -9,19 +11,23 @@ * Created by hspark on 16/11/2018. */ public class LadderResult { - private List gamers; - private List ladderLines; + private LadderPoints ladderPoints; + private LadderLayers ladderLayers; - public LadderResult(List gamers, List ladderLines) { - this.gamers = gamers; - this.ladderLines = ladderLines; + public LadderResult(LadderPoints ladderPoints, LadderLayers ladderLayers) { + this.ladderPoints = ladderPoints; + this.ladderLayers = ladderLayers; } - public List getGamers() { - return gamers; + public Point getEndPointByStartPoint(Point point) { + return ladderPoints.findCurrentPointByStartPoint(point); } - public List getLadderLines() { - return ladderLines; + public List getLadderPoints() { + return ladderPoints.getPoints(); + } + + public List getLadderLayers() { + return ladderLayers.getLadderLayers(); } } diff --git a/src/main/java/domain/dto/GamerDTO.java b/src/main/java/domain/dto/GamerDTO.java deleted file mode 100644 index 2473d59dc3..0000000000 --- a/src/main/java/domain/dto/GamerDTO.java +++ /dev/null @@ -1,25 +0,0 @@ -package domain.dto; - -import domain.Gamer; - -/** - * Created by hspark on 16/11/2018. - */ -public class GamerDTO { - private String name; - - public static GamerDTO of(Gamer gamer) { - GamerDTO gamerDTO = new GamerDTO(); - gamerDTO.setName(gamer.getName()); - return gamerDTO; - } - - private void setName(String name) { - this.name = name; - } - - @Override - public String toString() { - return name; - } -} diff --git a/src/main/java/domain/dto/LadderLayerDTO.java b/src/main/java/domain/dto/LadderLayerDTO.java deleted file mode 100644 index 08faae3e8d..0000000000 --- a/src/main/java/domain/dto/LadderLayerDTO.java +++ /dev/null @@ -1,18 +0,0 @@ -package domain.dto; - -import java.util.List; - -/** - * Created by hspark on 16/11/2018. - */ -public class LadderLayerDTO { - private List lineDTOList; - - public LadderLayerDTO(List lineDTOList) { - this.lineDTOList = lineDTOList; - } - - public List getLineDTOList() { - return lineDTOList; - } -} diff --git a/src/main/java/domain/dto/LineDTO.java b/src/main/java/domain/dto/LineDTO.java deleted file mode 100644 index 3ea51eb470..0000000000 --- a/src/main/java/domain/dto/LineDTO.java +++ /dev/null @@ -1,24 +0,0 @@ -package domain.dto; - -import domain.LadderLine; - -/** - * Created by hspark on 16/11/2018. - */ -public final class LineDTO { - private boolean drawn; - - public static LineDTO of(LadderLine ladderLine) { - LineDTO lineDTO = new LineDTO(); - lineDTO.setDrawn(ladderLine.isDrawn()); - return lineDTO; - } - - private void setDrawn(boolean drawn) { - this.drawn = drawn; - } - - public boolean isDrawn() { - return drawn; - } -} diff --git a/src/main/java/domain/Gamer.java b/src/main/java/domain/gamer/Gamer.java similarity index 51% rename from src/main/java/domain/Gamer.java rename to src/main/java/domain/gamer/Gamer.java index 6de2dfe5d4..2e78825404 100644 --- a/src/main/java/domain/Gamer.java +++ b/src/main/java/domain/gamer/Gamer.java @@ -1,20 +1,37 @@ -package domain; +package domain.gamer; import com.google.common.base.Preconditions; +import domain.point.Point; /** * Created by hspark on 16/11/2018. */ public class Gamer { public static final int MAX_GAMER_NAME_LENGTH = 5; + private String name; + private Point point; - public Gamer(String name) { + public Gamer(String name, int position) { Preconditions.checkArgument(name.length() <= MAX_GAMER_NAME_LENGTH, "이름이 너무 깁니다."); this.name = name; + this.point = Point.of(position); } public String getName() { return name; } + + public Point getPoint() { + return point; + } + + public boolean isEqualName(String gamerName) { + return gamerName == this.name; + } + + @Override + public String toString() { + return name; + } } diff --git a/src/main/java/domain/gamer/Gamers.java b/src/main/java/domain/gamer/Gamers.java new file mode 100644 index 0000000000..d7363fd109 --- /dev/null +++ b/src/main/java/domain/gamer/Gamers.java @@ -0,0 +1,38 @@ +package domain.gamer; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Created by hspark on 18/11/2018. + */ +public class Gamers { + private List gamers; + + public Gamers(List gamerValues) { + this.gamers = initGamer(gamerValues); + } + + public int size() { + return gamers.size(); + } + + private List initGamer(List gamerNameList) { + List gamers = new ArrayList<>(); + int position = 0; + for (String gamerName : gamerNameList) { + gamers.add(new Gamer(gamerName, position++)); + } + return gamers; + } + + public Gamer findByGamerName(String gamerName) { + return gamers.stream().filter(gamer -> gamer.isEqualName(gamerName)).findFirst().orElseThrow(IllegalAccessError::new); + } + + public List getGamerList() { + return Collections.unmodifiableList(gamers); + } + +} diff --git a/src/main/java/domain/ladder/LadderLayer.java b/src/main/java/domain/ladder/LadderLayer.java new file mode 100644 index 0000000000..8208a52e8c --- /dev/null +++ b/src/main/java/domain/ladder/LadderLayer.java @@ -0,0 +1,49 @@ +package domain.ladder; + +import com.google.common.base.Preconditions; +import domain.LadderLineSupplier; +import domain.point.Point; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.function.BinaryOperator; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +/** + * Created by hspark on 16/11/2018. + */ +public class LadderLayer { + public static final int MIN_LADDER_WIDTH = 0; + + private List ladderLines; + + public LadderLayer(int width) { + Preconditions.checkArgument(width >= MIN_LADDER_WIDTH, "너비는 0 이상이어야 합니다."); + this.ladderLines = IntStream.range(MIN_LADDER_WIDTH, width).mapToObj(i -> new LadderLine(Point.of(i), Point.of(i + 1))) + .collect(Collectors.toList()); + } + + public List getLadderLines() { + return Collections.unmodifiableList(ladderLines); + } + + public void drawLines(LadderLineSupplier supplier) { + BinaryOperator lineBinaryOperator = ladderLineAccumulator(supplier); + ladderLines.stream().reduce(new LadderLine(Point.of(MIN_LADDER_WIDTH - 1), Point.of(MIN_LADDER_WIDTH)), lineBinaryOperator); + } + + public Optional getPassableLadderLine(Point point) { + return ladderLines.stream().filter(ladderLine -> ladderLine.isPassable(point)).findFirst(); + } + + private BinaryOperator ladderLineAccumulator(LadderLineSupplier supplier) { + return (previousLadderLine, ladderLine) -> { + if (supplier.get() && !previousLadderLine.isDrawn()) { + ladderLine.draw(); + } + return ladderLine; + }; + } +} diff --git a/src/main/java/domain/ladder/LadderLayers.java b/src/main/java/domain/ladder/LadderLayers.java new file mode 100644 index 0000000000..3ee39e9c76 --- /dev/null +++ b/src/main/java/domain/ladder/LadderLayers.java @@ -0,0 +1,38 @@ +package domain.ladder; + +import domain.LadderLineSupplier; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +/** + * Created by hspark on 18/11/2018. + */ +public class LadderLayers { + public static final int MIN_LADDER_HEIGHT = 1; + + private List ladderLayers; + + public LadderLayers(int height, int width) { + this.ladderLayers = IntStream.range(MIN_LADDER_HEIGHT - 1, height).mapToObj(integer -> new LadderLayer(width)) + .collect(Collectors.toList()); + } + + public void drawAllLadders(LadderLineSupplier supplier) { + ladderLayers.stream().forEach(ladderLayer -> ladderLayer.drawLines(supplier)); + } + + public List getLadderLayers() { + return Collections.unmodifiableList(ladderLayers); + } + + public boolean isBottomLayer(int layerNumber) { + return ladderLayers.size() == layerNumber; + } + + public LadderLayer getLayer(int layerNumber) { + return ladderLayers.get(layerNumber); + } +} diff --git a/src/main/java/domain/ladder/LadderLine.java b/src/main/java/domain/ladder/LadderLine.java new file mode 100644 index 0000000000..727d01936a --- /dev/null +++ b/src/main/java/domain/ladder/LadderLine.java @@ -0,0 +1,36 @@ +package domain.ladder; + +import domain.point.ConnectionPoint; +import domain.point.Point; + +/** + * Created by hspark on 16/11/2018. + */ +public class LadderLine { + private ConnectionPoint connectionPoint; + private boolean drawn; + + public LadderLine(Point lefPoint, Point rightPoint) { + this.connectionPoint = new ConnectionPoint(lefPoint, rightPoint); + } + + public void draw() { + this.drawn = true; + } + + public boolean isDrawn() { + return drawn; + } + + public boolean isPassable(Point point) { + return connectionPoint.isConnection(point) && isDrawn(); + } + + public Point getMovePosition(Point point) { + if (!isPassable(point)) { + throw new IllegalArgumentException(); + } + return connectionPoint.getConnectionPoint(point); + } + +} diff --git a/src/main/java/domain/point/ConnectionPoint.java b/src/main/java/domain/point/ConnectionPoint.java new file mode 100644 index 0000000000..654869b6a4 --- /dev/null +++ b/src/main/java/domain/point/ConnectionPoint.java @@ -0,0 +1,33 @@ +package domain.point; + +import com.google.common.base.Preconditions; + +/** + * Created by hspark on 18/11/2018. + */ +public class ConnectionPoint { + private Point leftVertex; + private Point rightVertex; + + public ConnectionPoint(Point leftPoint, Point rightPoint) { + Preconditions.checkArgument(leftPoint.isAdjacent(rightPoint)); + Preconditions.checkArgument(leftPoint.getDiff(rightPoint) < 0); + + this.leftVertex = leftPoint; + this.rightVertex = rightPoint; + } + + public boolean isConnection(Point point) { + return (leftVertex.equals(point) || rightVertex.equals(point)); + } + + public Point getConnectionPoint(Point point) { + if (!isConnection(point)) { + throw new IllegalArgumentException(); + } + if (leftVertex.equals(point)) { + return rightVertex; + } + return leftVertex; + } +} diff --git a/src/main/java/domain/point/LadderPoints.java b/src/main/java/domain/point/LadderPoints.java new file mode 100644 index 0000000000..b5b85805d0 --- /dev/null +++ b/src/main/java/domain/point/LadderPoints.java @@ -0,0 +1,51 @@ +package domain.point; + +import domain.ladder.LadderLayer; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +/** + * Created by hspark on 18/11/2018. + */ +public class LadderPoints { + private Map points; + + public LadderPoints(int pointCount) { + this.points = IntStream.range(0, pointCount).mapToObj(Point::of) + .collect(Collectors.toMap(Function.identity(), Function.identity())); + } + + public List getPoints() { + return Collections.unmodifiableList(new ArrayList<>(points.values())); + } + + public Point findCurrentPointByStartPoint(Point point) { + return points.get(point); + } + + public void put(Point key, Point value) { + points.put(key, value); + } + + public void moveAll(LadderLayer ladderLayer) { + for (Point point : points.keySet()) { + move(point, ladderLayer); + } + } + + public void move(Point key, LadderLayer ladderLayer) { + Point point = findCurrentPointByStartPoint(key); + ladderLayer.getPassableLadderLine(point) + .ifPresent(ladderLine -> put(key, ladderLine.getMovePosition(point))); + } + + public int getWidth() { + return points.size() - 1; + } +} diff --git a/src/main/java/domain/point/Point.java b/src/main/java/domain/point/Point.java new file mode 100644 index 0000000000..88131854fd --- /dev/null +++ b/src/main/java/domain/point/Point.java @@ -0,0 +1,52 @@ +package domain.point; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * Created by hspark on 18/11/2018. + */ +public final class Point { + private static Map CACHE = new HashMap<>(); + private final int point; + + private Point(int point) { + this.point = point; + } + + public static Point of(int pointValue) { + Point cachePoint = CACHE.get(pointValue); + if (Objects.nonNull(cachePoint)) { + return cachePoint; + } + Point point = new Point(pointValue); + CACHE.put(pointValue, point); + return point; + } + + public boolean isAdjacent(Point other) { + return Math.abs(point - other.point) == 1; + } + + public int getDiff(Point other) { + return point - other.point; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + Point point1 = (Point) o; + + return point == point1.point; + } + + @Override + public int hashCode() { + return point; + } +} diff --git a/src/main/java/domain/reward/Reward.java b/src/main/java/domain/reward/Reward.java new file mode 100644 index 0000000000..acc34e806e --- /dev/null +++ b/src/main/java/domain/reward/Reward.java @@ -0,0 +1,25 @@ +package domain.reward; + +import domain.point.Point; + +/** + * Created by hspark on 18/11/2018. + */ +public class Reward { + private String name; + private Point point; + + public Reward(String name, Point point) { + this.name = name; + this.point = point; + } + + public boolean isEqualPoint(Point point) { + return this.point.equals(point); + } + + @Override + public String toString() { + return name; + } +} diff --git a/src/main/java/domain/reward/Rewards.java b/src/main/java/domain/reward/Rewards.java new file mode 100644 index 0000000000..91eb6c690f --- /dev/null +++ b/src/main/java/domain/reward/Rewards.java @@ -0,0 +1,35 @@ +package domain.reward; + +import domain.point.Point; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Created by hspark on 18/11/2018. + */ +public class Rewards { + private List rewards; + + public Rewards(List rewards) { + this.rewards = initRewards(rewards); + } + + private List initRewards(List rewardList) { + List rewards = new ArrayList<>(); + int position = 0; + for (String reward : rewardList) { + rewards.add(new Reward(reward, Point.of(position++))); + } + return rewards; + } + + public Reward getRewardByPoint(Point point) { + return rewards.stream().filter(reward -> reward.isEqualPoint(point)).findFirst().orElseThrow(IllegalAccessError::new); + } + + public List getRewardList() { + return Collections.unmodifiableList(rewards); + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 47c493bb48..f9321a592c 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -14,9 +14,21 @@ public static List inputGamers() { return Arrays.asList(scanner.nextLine().trim().split(",")); } + public static List inputRewards() { + System.out.println("실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요)"); + Scanner scanner = new Scanner(System.in); + return Arrays.asList(scanner.nextLine().trim().split(",")); + } + public static int inputLadderHeight() { System.out.println("최대 사다리 높이는 몇 개인가요?"); Scanner scanner = new Scanner(System.in); return scanner.nextInt(); } + + public static String inputGamerNameForReward() { + System.out.println("결과를 보고 싶은 사람은?"); + Scanner scanner = new Scanner(System.in); + return scanner.nextLine(); + } } diff --git a/src/main/java/view/LadderMain.java b/src/main/java/view/LadderMain.java index 4a409ebffa..08d8385b0a 100644 --- a/src/main/java/view/LadderMain.java +++ b/src/main/java/view/LadderMain.java @@ -1,23 +1,27 @@ package view; -import domain.Ladder; -import domain.LadderResult; -import domain.RandomLadderLineSupplier; - -import java.util.List; +import domain.*; +import domain.gamer.Gamers; +import domain.reward.Rewards; /** * Created by hspark on 16/11/2018. */ public class LadderMain { public static void main(String[] args) { - List gamerNames = InputView.inputGamers(); + Gamers gamers = new Gamers(InputView.inputGamers()); + Rewards rewards = new Rewards(InputView.inputRewards()); + LadderGameInfo ladderGameInfo = new LadderGameInfo(gamers, rewards); int ladderHeight = InputView.inputLadderHeight(); - Ladder ladder = new Ladder(gamerNames, ladderHeight, new RandomLadderLineSupplier()); - ladder.drawLadder(); + Ladder ladder = new Ladder(gamers.size()); + ladder.drawLadder(ladderHeight, new RandomLadderLineSupplier()); + ladder.moveAll(); LadderResult ladderResult = ladder.getLadderGameResult(); - OutputView.printLadder(ladderResult); + OutputView.printLadder(ladderResult, ladderGameInfo); + + String gamerName = InputView.inputGamerNameForReward(); + OutputView.printReward(ladderResult, ladderGameInfo, gamerName); } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 41e7f53eb6..96044552ea 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,14 +1,16 @@ package view; -import domain.LadderResult; -import domain.dto.GamerDTO; -import domain.dto.LadderLayerDTO; -import domain.dto.LineDTO; +import domain.*; +import domain.gamer.Gamer; +import domain.ladder.LadderLayer; +import domain.ladder.LadderLine; +import domain.point.Point; +import domain.reward.Reward; import org.apache.commons.lang3.StringUtils; import java.util.List; -import static domain.Gamer.MAX_GAMER_NAME_LENGTH; +import static domain.gamer.Gamer.MAX_GAMER_NAME_LENGTH; /** * Created by hspark on 16/11/2018. @@ -19,24 +21,48 @@ public class OutputView { public static final String LADDER_LINE_CHR = "-----"; public static final String LADDER_NON_LINE_CHR = " "; - public static void printLadder(LadderResult ladderResult) { - List gamers = ladderResult.getGamers(); - + public static void printLadder(LadderResult ladderResult, LadderGameInfo ladderGameInfo) { StringBuilder stringBuilder = new StringBuilder(); - for (GamerDTO gamer : gamers) { + for (Gamer gamer : ladderGameInfo.getGamers().getGamerList()) { stringBuilder.append(StringUtils.rightPad(gamer.toString(), MAX_GAMER_NAME_LENGTH + 1)); } stringBuilder.append("\n"); - List ladderLines = ladderResult.getLadderLines(); + List ladderLines = ladderResult.getLadderLayers(); - for (LadderLayerDTO ladderLine : ladderLines) { - for (LineDTO line : ladderLine.getLineDTOList()) { + for (LadderLayer ladderLine : ladderLines) { + for (LadderLine line : ladderLine.getLadderLines()) { stringBuilder.append(LADDER_LAYER_STR); stringBuilder.append(line.isDrawn() ? LADDER_LINE_CHR : LADDER_NON_LINE_CHR); } stringBuilder.append("|\n"); } + + for (Reward reward : ladderGameInfo.getRewards().getRewardList()) { + stringBuilder.append(StringUtils.rightPad(reward.toString(), MAX_GAMER_NAME_LENGTH + 1)); + } + System.out.println(stringBuilder.toString()); } + + public static void printReward(LadderResult ladderResult, LadderGameInfo ladderGameInfo, String gamerName) { + + System.out.println("실행결과"); + if (LadderGameInfo.ALL_GAMER.equalsIgnoreCase(gamerName)) { + printAll(ladderResult, ladderGameInfo); + return; + } + + Point startPoint = ladderGameInfo.findStartPointByGamerName(gamerName); + Point endPoint = ladderResult.getEndPointByStartPoint(startPoint); + System.out.println(ladderGameInfo.getRewardByPoint(endPoint)); + } + + private static void printAll(LadderResult ladderResult, LadderGameInfo ladderGameInfo) { + for (Gamer gamer : ladderGameInfo.getGamers().getGamerList()) { + Point startPoint = ladderGameInfo.findStartPointByGamerName(gamer.getName()); + Point endPoint = ladderResult.getEndPointByStartPoint(startPoint); + System.out.println(gamer.getName() + " : " + ladderGameInfo.getRewardByPoint(endPoint)); + } + } } diff --git a/src/test/java/domain/LadderLayerTest.java b/src/test/java/domain/LadderLayerTest.java deleted file mode 100644 index 5ab3293b6f..0000000000 --- a/src/test/java/domain/LadderLayerTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package domain; - -import domain.dto.LadderLayerDTO; -import org.assertj.core.api.Assertions; -import org.junit.Test; - -/** - * Created by hspark on 16/11/2018. - */ - -/** - * 1. 라인의 갯수는 0개에서 사다리 폭(인원수 -1개)까지이다. - * 2. 라인을 만들 때, 좌/우에는 라인이 없어야한다. - * 3. 직전에 라인을 그렸으면 다음 라인은 패스한다. - * 3. 라인제네레이터는 해당 라인에 선을 그을지 true/false 만을 반환한다. - */ - -public class LadderLayerTest { - - @Test(expected = IllegalArgumentException.class) - public void test_너비음수_에러() { - LadderLayer ladderLayer = new LadderLayer(-1, () -> true); - ladderLayer.drawLines(); - } - - @Test - public void test_너비0_라인미생성() { - LadderLayer ladderLayer = new LadderLayer(0, () -> true); - ladderLayer.drawLines(); - LadderLayerDTO ladderLineDTO = ladderLayer.getLadderLineDTO(); - Assertions.assertThat(ladderLineDTO.getLineDTOList()).hasSize(0); - } - - @Test - public void test_너비1_라인한개() { - LadderLayer ladderLayer = new LadderLayer(1, () -> true); - ladderLayer.drawLines(); - LadderLayerDTO ladderLineDTO = ladderLayer.getLadderLineDTO(); - Assertions.assertThat(ladderLineDTO.getLineDTOList()).hasSize(1); - Assertions.assertThat(ladderLineDTO.getLineDTOList()).extracting("drawn").contains(true); - } - - @Test - public void test_너비3_이어지는_라인_없음() { - LadderLayer ladderLayer = new LadderLayer(3, () -> true); - ladderLayer.drawLines(); - LadderLayerDTO ladderLineDTO = ladderLayer.getLadderLineDTO(); - Assertions.assertThat(ladderLineDTO.getLineDTOList()).hasSize(3); - Assertions.assertThat(ladderLineDTO.getLineDTOList()).extracting("drawn").contains(true, false, true); - } -} diff --git a/src/test/java/domain/LadderTest.java b/src/test/java/domain/LadderTest.java index 346ea06317..0d7caf5704 100644 --- a/src/test/java/domain/LadderTest.java +++ b/src/test/java/domain/LadderTest.java @@ -1,10 +1,9 @@ package domain; +import domain.point.Point; import org.assertj.core.api.Assertions; import org.junit.Test; -import java.util.Arrays; - /** * Created by hspark on 16/11/2018. */ @@ -17,29 +16,54 @@ public class LadderTest { @Test(expected = IllegalArgumentException.class) public void test_높이가_0일때() { - Ladder ladder = new Ladder(Arrays.asList("test"), 0, () -> true); + Ladder ladder = new Ladder(2); + ladder.drawLadder(0, () -> true); } @Test(expected = IllegalArgumentException.class) public void test_높이가_1일때() { - Ladder ladder = new Ladder(Arrays.asList("test"), 1, () -> true); + Ladder ladder = new Ladder(2); + ladder.drawLadder(1, () -> true); } @Test public void test_높이만큼_사다리_생성_5개() { - Ladder ladder = new Ladder(Arrays.asList("test"), 5, () -> true); + Ladder ladder = new Ladder(1); + ladder.drawLadder(5, () -> true); LadderResult ladderResult = ladder.getLadderGameResult(); - Assertions.assertThat(ladderResult.getGamers()).hasSize(1); - Assertions.assertThat(ladderResult.getLadderLines()).hasSize(5); + Assertions.assertThat(ladderResult.getLadderPoints()).hasSize(1); + Assertions.assertThat(ladderResult.getLadderLayers()).hasSize(5); } @Test public void test_사다리_참가자_3명() { - Ladder ladder = new Ladder(Arrays.asList("test1", "test2", "test3"), 5, () -> true); - ladder.drawLadder(); + Ladder ladder = new Ladder(3); + ladder.drawLadder(5, () -> true); + LadderResult ladderResult = ladder.getLadderGameResult(); + Assertions.assertThat(ladderResult.getLadderPoints()).hasSize(3); + Assertions.assertThat(ladderResult.getLadderLayers()).hasSize(5); + } + + @Test + public void test_사다리_이동() { + Ladder ladder = new Ladder(2); + ladder.drawLadder(2, () -> true); + ladder.moveAll(); + LadderResult ladderResult = ladder.getLadderGameResult(); + Assertions.assertThat(ladderResult.getEndPointByStartPoint(Point.of(0))).isEqualTo(Point.of(0)); + Assertions.assertThat(ladderResult.getEndPointByStartPoint(Point.of(1))).isEqualTo(Point.of(1)); + } + + @Test + public void test_사다리_이동_4명() { + Ladder ladder = new Ladder(4); + ladder.drawLadder(2, () -> true); + ladder.moveAll(); LadderResult ladderResult = ladder.getLadderGameResult(); - Assertions.assertThat(ladderResult.getGamers()).hasSize(3); - Assertions.assertThat(ladderResult.getLadderLines()).hasSize(5); + Assertions.assertThat(ladderResult.getEndPointByStartPoint(Point.of(0))).isEqualTo(Point.of(0)); + Assertions.assertThat(ladderResult.getEndPointByStartPoint(Point.of(1))).isEqualTo(Point.of(1)); + Assertions.assertThat(ladderResult.getEndPointByStartPoint(Point.of(2))).isEqualTo(Point.of(2)); + Assertions.assertThat(ladderResult.getEndPointByStartPoint(Point.of(3))).isEqualTo(Point.of(3)); } } diff --git a/src/test/java/domain/GamerTest.java b/src/test/java/domain/gamer/GamerTest.java similarity index 57% rename from src/test/java/domain/GamerTest.java rename to src/test/java/domain/gamer/GamerTest.java index 4bc573be48..47cfd92197 100644 --- a/src/test/java/domain/GamerTest.java +++ b/src/test/java/domain/gamer/GamerTest.java @@ -1,22 +1,21 @@ -package domain; +package domain.gamer; import org.assertj.core.api.Assertions; import org.junit.Test; -import static org.junit.Assert.*; - /** * Created by hspark on 16/11/2018. */ + public class GamerTest { @Test(expected = IllegalArgumentException.class) - public void test_이름생성_6글자() { - new Gamer("123456"); + public void test_게이머생성_6글자() { + new Gamer("123456", 0); } @Test - public void test_이름생성_5글자() { - Gamer gamer = new Gamer("12345"); + public void test_게이머생성_5글자() { + Gamer gamer = new Gamer("12345", 0); Assertions.assertThat(gamer.getName()).isEqualTo("12345"); } } \ No newline at end of file diff --git a/src/test/java/domain/gamer/GamersTest.java b/src/test/java/domain/gamer/GamersTest.java new file mode 100644 index 0000000000..2a906a0c7f --- /dev/null +++ b/src/test/java/domain/gamer/GamersTest.java @@ -0,0 +1,21 @@ +package domain.gamer; + +import org.assertj.core.api.Assertions; +import org.junit.Test; + +import java.util.Arrays; + +import static org.junit.Assert.*; + +/** + * Created by hspark on 18/11/2018. + */ +public class GamersTest { + + @Test + public void test_생성() { + Gamers gamers = new Gamers(Arrays.asList("test")); + Gamer gamer = gamers.findByGamerName("test"); + Assertions.assertThat(gamer.isEqualName("test")).isTrue(); + } +} \ No newline at end of file diff --git a/src/test/java/domain/ladder/LadderLayerTest.java b/src/test/java/domain/ladder/LadderLayerTest.java new file mode 100644 index 0000000000..c0dc2d376e --- /dev/null +++ b/src/test/java/domain/ladder/LadderLayerTest.java @@ -0,0 +1,67 @@ +package domain.ladder; + +import domain.point.Point; +import org.assertj.core.api.Assertions; +import org.junit.Test; + +import java.util.List; +import java.util.Optional; + +/** + * Created by hspark on 16/11/2018. + */ + +/** + * 1. 라인의 갯수는 0개에서 사다리 폭(인원수 -1개)까지이다. + * 2. 라인을 만들 때, 좌/우에는 라인이 없어야한다. + * 3. 직전에 라인을 그렸으면 다음 라인은 패스한다. + * 3. 라인제네레이터는 해당 라인에 선을 그을지 true/false 만을 반환한다. + * 4. LadderLayer에 Payer를 넘겨 이동 가능한 LadderLine을 받는다. + */ + +public class LadderLayerTest { + + @Test(expected = IllegalArgumentException.class) + public void test_너비음수_에러() { + LadderLayer ladderLayer = new LadderLayer(-1); + ladderLayer.drawLines(() -> true); + } + + @Test + public void test_너비0_라인미생성() { + LadderLayer ladderLayer = new LadderLayer(0); + ladderLayer.drawLines(() -> true); + List ladderLine = ladderLayer.getLadderLines(); + Assertions.assertThat(ladderLine).hasSize(0); + } + + @Test + public void test_너비1_라인한개() { + LadderLayer ladderLayer = new LadderLayer(1); + ladderLayer.drawLines(() -> true); + List ladderLine = ladderLayer.getLadderLines(); + Assertions.assertThat(ladderLine).hasSize(1); + Assertions.assertThat(ladderLine).extracting("drawn").contains(true); + } + + @Test + public void test_너비3_이어지는_라인_없음() { + LadderLayer ladderLayer = new LadderLayer(3); + ladderLayer.drawLines(() -> true); + List ladderLine = ladderLayer.getLadderLines(); + Assertions.assertThat(ladderLine).hasSize(3); + Assertions.assertThat(ladderLine).extracting("drawn").contains(true, false, true); + } + + @Test + public void test_이동가능한_LadderLine획득() { + LadderLayer ladderLayer = new LadderLayer(3); + ladderLayer.drawLines(() -> true); + + Point point = Point.of(0); + Optional ladderLine = ladderLayer.getPassableLadderLine(point); + + Assertions.assertThat(ladderLine.isPresent()).isTrue(); + Assertions.assertThat(ladderLine.get().isPassable(point)).isTrue(); + } +} diff --git a/src/test/java/domain/ladder/LadderLineTest.java b/src/test/java/domain/ladder/LadderLineTest.java new file mode 100644 index 0000000000..49d42829e8 --- /dev/null +++ b/src/test/java/domain/ladder/LadderLineTest.java @@ -0,0 +1,29 @@ +package domain.ladder; + +/** + * Created by hspark on 17/11/2018. + */ + +import domain.point.Point; +import org.assertj.core.api.Assertions; +import org.junit.Test; + +/** + * 1. 이동 좌표를 받고 이동 가능하면 변경된 위치를 반환한다. + */ +public class LadderLineTest { + + @Test + public void test_이동한_위치_반환() { + LadderLine ladderLine = new LadderLine(Point.of(0), Point.of(1)); + ladderLine.draw(); + Point movePosition = ladderLine.getMovePosition(Point.of(0)); + Assertions.assertThat(movePosition).isEqualTo(Point.of(1)); + } + + @Test(expected = IllegalArgumentException.class) + public void test_이동불가능한_사다리() { + LadderLine ladderLine = new LadderLine(Point.of(0), Point.of(1)); + ladderLine.getMovePosition(Point.of(2)); + } +} \ No newline at end of file diff --git a/src/test/java/domain/point/ConnectionPointTest.java b/src/test/java/domain/point/ConnectionPointTest.java new file mode 100644 index 0000000000..c994545cff --- /dev/null +++ b/src/test/java/domain/point/ConnectionPointTest.java @@ -0,0 +1,37 @@ +package domain.point; + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Created by hspark on 18/11/2018. + */ +public class ConnectionPointTest { + @Test(expected = IllegalArgumentException.class) + public void test_생성시_인접해야함() { + new ConnectionPoint(Point.of(1), Point.of(3)); + } + + @Test + public void test_연결점이있는지_확인() { + ConnectionPoint connectionPoint = new ConnectionPoint(Point.of(0), Point.of(1)); + boolean isConnection = connectionPoint.isConnection(Point.of(1)); + Point point = connectionPoint.getConnectionPoint(Point.of(1)); + assertThat(isConnection).isTrue(); + assertThat(point).isEqualTo(Point.of(0)); + } + + @Test(expected = IllegalArgumentException.class) + public void test_연결점이없음() { + ConnectionPoint connectionPoint = new ConnectionPoint(Point.of(0), Point.of(1)); + boolean isConnection = connectionPoint.isConnection(Point.of(2)); + assertThat(isConnection).isFalse(); + connectionPoint.getConnectionPoint(Point.of(2)); + } + + @Test(expected = IllegalArgumentException.class) + public void test_좌우가_바뀜() { + new ConnectionPoint(Point.of(1), Point.of(0)); + } +} \ No newline at end of file diff --git a/src/test/java/domain/point/LadderPointsTest.java b/src/test/java/domain/point/LadderPointsTest.java new file mode 100644 index 0000000000..0a86e235b1 --- /dev/null +++ b/src/test/java/domain/point/LadderPointsTest.java @@ -0,0 +1,30 @@ +package domain.point; + +import domain.ladder.LadderLayer; +import org.assertj.core.api.Assertions; +import org.junit.Test; + +/** + * Created by hspark on 18/11/2018. + */ +public class LadderPointsTest { + + @Test + public void test_생성() { + LadderPoints ladderPoints = new LadderPoints(1); + Point point = ladderPoints.findCurrentPointByStartPoint(Point.of(0)); + Assertions.assertThat(point).isEqualTo(Point.of(0)); + } + + @Test + public void test_이동() { + LadderPoints ladderPoints = new LadderPoints(2); + + LadderLayer ladderLayer = new LadderLayer(2); + ladderLayer.drawLines(() -> true); + + ladderPoints.move(Point.of(0), ladderLayer); + Point currentPoint = ladderPoints.findCurrentPointByStartPoint(Point.of(0)); + Assertions.assertThat(currentPoint).isEqualTo(Point.of(1)); + } +} \ No newline at end of file diff --git a/src/test/java/domain/point/PointTest.java b/src/test/java/domain/point/PointTest.java new file mode 100644 index 0000000000..c84c784233 --- /dev/null +++ b/src/test/java/domain/point/PointTest.java @@ -0,0 +1,29 @@ +package domain.point; + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Created by hspark on 18/11/2018. + */ +public class PointTest { + + @Test + public void test_인접() { + Point point = Point.of(1); + Point otherPoint = Point.of(2); + + assertThat(point.isAdjacent(otherPoint)).isTrue(); + assertThat(point.getDiff(otherPoint)).isEqualTo(-1); + } + + @Test + public void test_인접하지_않음() { + Point point = Point.of(1); + Point otherPoint = Point.of(3); + + assertThat(point.isAdjacent(otherPoint)).isFalse(); + assertThat(point.getDiff(otherPoint)).isEqualTo(-2); + } +} \ No newline at end of file