diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..5a8a86466f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,24 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +trim_trailing_whitespace = true + +# Java files +[*.java] +indent_style = space +indent_size = 4 +max_line_length = 120 +continuation_indent_size = 8 + +# Prevent breaking method chains +ij_java_method_call_chain_wrap = off +ij_java_keep_line_breaks = true +ij_java_align_multiline_chained_methods = true +ij_java_keep_multiple_expressions_in_one_line = true \ No newline at end of file diff --git a/src/main/README.md b/src/main/README.md index 4396116bd8..1b37840673 100644 --- a/src/main/README.md +++ b/src/main/README.md @@ -1,4 +1,4 @@ -# [사다리타기] Step2 +# 🚀 3단계 - 사다리(게임 실행) ## # Step1 피드백 @@ -36,3 +36,15 @@ - [x] 컨벤션 확인 - [x] `Point` 출력 기호 삭제 - [x] `NameList` 가 `Name` 을 사용하도록 변경 + +--- + +- [x] `PointList` 객체가 스스로 판단하는 구조로 개편 +- [x] `Point` 테스트 코드에서 이전 이름인 "PointX" 삭제 +- [x] `Point` ReultView 코드 삭제 -> 역할을 넘어간다고 생각 + +## # Step3 요구사항 + +* 사다리 실행 결과 출력 + - [x] 개인별 이름을 입력하면 개인별 결과를 출력 + - [x] "all" 을 입력하면 전체 참여자의 실행 결과를 출력하고 종료 diff --git a/src/main/java/nextstep/ladder/controller/Game.java b/src/main/java/nextstep/ladder/controller/Game.java index e195c44f06..70f3c82e65 100644 --- a/src/main/java/nextstep/ladder/controller/Game.java +++ b/src/main/java/nextstep/ladder/controller/Game.java @@ -1,22 +1,31 @@ package nextstep.ladder.controller; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.IntStream; import nextstep.ladder.module.Board; +import nextstep.ladder.module.BoardResult; import nextstep.ladder.module.Height; import nextstep.ladder.module.Line; +import nextstep.ladder.module.Name; import nextstep.ladder.module.NameList; import nextstep.ladder.module.PointList; +import nextstep.ladder.module.ResultList; public class Game { - private final List peopleNames; + private final NameList peopleNames; + private final ResultList resultNames; private final Height height; - public Game(List peopleNames, Height height) { + public Game(NameList peopleNames, ResultList resultNames, Height height) { this.peopleNames = peopleNames; + this.resultNames = resultNames; this.height = height; + validateGame(); } public Board createBoard() { @@ -24,7 +33,49 @@ public Board createBoard() { for (int i = 0; i < height.value(); i++) { lines.add(new Line(new PointList(peopleNames.size()))); } - lines.forEach(Line::createLadders); - return new Board(lines, new NameList(peopleNames)); + lines.forEach(Line::createRandomBridges); + return new Board(lines, peopleNames); + } + + private void validateGame() { + if (peopleNames.size() != resultNames.size()) { + throw new IllegalArgumentException("사람 이름과 결과 이름의 개수가 다릅니다."); + } + } + + public BoardResult play(Board board) { + Map resultMap = new HashMap<>(); + IntStream.range(0, peopleNames.size()) + .forEach(i -> { + Name name = peopleNames.get(i); + resultMap.put(name, i); + }); + for (Line line : board.lines()) { + IntStream.range(0, peopleNames.size()) + .forEach(i -> { + Name name = peopleNames.get(i); + resultMap.put(name, move(resultMap.get(name), line)); + }); + } + + return new BoardResult(resultMap, resultNames); + } + + private int move(int index, Line line) { + if (canMoveLeft(index, line)) { + return index - 1; + } + if (canMoveRight(index, line)) { + return index + 1; + } + return index; + } + + private boolean canMoveLeft(int index, Line line) { + return line.points().get(index).leftBridge().isBuilt(); + } + + private boolean canMoveRight(int index, Line line) { + return line.points().get(index).rightBridge().isBuilt(); } } diff --git a/src/main/java/nextstep/ladder/controller/Main.java b/src/main/java/nextstep/ladder/controller/Main.java index bf6b1fafc2..dd05d15698 100644 --- a/src/main/java/nextstep/ladder/controller/Main.java +++ b/src/main/java/nextstep/ladder/controller/Main.java @@ -1,9 +1,11 @@ package nextstep.ladder.controller; -import java.util.List; - import nextstep.ladder.module.Board; +import nextstep.ladder.module.BoardResult; import nextstep.ladder.module.Height; +import nextstep.ladder.module.Name; +import nextstep.ladder.module.NameList; +import nextstep.ladder.module.ResultList; import nextstep.ladder.view.InputView; import nextstep.ladder.view.ResultView; @@ -13,12 +15,24 @@ public class Main { private static final ResultView resultView = new ResultView(); public static void main(String[] args) { - List peopleNames = inputView.getPeopleNames(); + NameList peopleNames = new NameList(inputView.getPeopleNames()); + ResultList resultNames = new ResultList(inputView.getResultNames()); Height height = new Height(inputView.getHeight()); - Game game = new Game(peopleNames, height); + Game game = new Game(peopleNames, resultNames, height); Board board = game.createBoard(); resultView.printBoard(board); + resultView.printResultNames(resultNames); + + BoardResult boardResult = game.play(board); + + while (true) { + Name wantedName = new Name(inputView.getWantedName()); + resultView.printResults(wantedName, boardResult); + if (wantedName.equals(new Name("all"))) { + break; + } + } } } diff --git a/src/main/java/nextstep/ladder/module/BoardResult.java b/src/main/java/nextstep/ladder/module/BoardResult.java new file mode 100644 index 0000000000..9970826dab --- /dev/null +++ b/src/main/java/nextstep/ladder/module/BoardResult.java @@ -0,0 +1,26 @@ +package nextstep.ladder.module; + +import java.util.Map; +import java.util.stream.Collectors; + +public class BoardResult { + + private final Map resultMap; + private final ResultList resultNames; + + public BoardResult(Map resultMap, ResultList resultNames) { + this.resultMap = resultMap; + this.resultNames = resultNames; + } + + public Result of(Name name) { + return resultNames.get(resultMap.get(name)); + } + + public Map all() { + return resultMap.entrySet().stream() + .collect(Collectors.toMap( + Map.Entry::getKey, + entry -> resultNames.get(entry.getValue()))); + } +} diff --git a/src/main/java/nextstep/ladder/module/Bridge.java b/src/main/java/nextstep/ladder/module/LeftBridge.java similarity index 68% rename from src/main/java/nextstep/ladder/module/Bridge.java rename to src/main/java/nextstep/ladder/module/LeftBridge.java index eda4ded3b4..32e2b6b314 100644 --- a/src/main/java/nextstep/ladder/module/Bridge.java +++ b/src/main/java/nextstep/ladder/module/LeftBridge.java @@ -1,14 +1,14 @@ package nextstep.ladder.module; -public class Bridge { +public class LeftBridge { private final boolean isBuilt; - public Bridge() { + public LeftBridge() { this(false); } - public Bridge(boolean isBuilt) { + public LeftBridge(boolean isBuilt) { this.isBuilt = isBuilt; } diff --git a/src/main/java/nextstep/ladder/module/Line.java b/src/main/java/nextstep/ladder/module/Line.java index cac7c9f364..ae7fc6fec1 100644 --- a/src/main/java/nextstep/ladder/module/Line.java +++ b/src/main/java/nextstep/ladder/module/Line.java @@ -20,20 +20,39 @@ private void validate(PointList points) { if (points.size() < 2) { throw new IllegalArgumentException("Line의 크기는 2 이상이어야 합니다."); } - if (points.get(0).bridge().isBuilt()) { + if (points.get(0).leftBridge().isBuilt()) { throw new IllegalArgumentException("Line의 시작은 사다리가 없어야 합니다."); } - for (int i = 1; i < points.size(); i++) { - if (points.get(i).bridge().isBuilt() && points.get(i + 1).bridge().isBuilt()) { - throw new IllegalArgumentException("Line에서 연속된 사다리가 있으면 안됩니다."); - } + if (points.get(points.size() - 1).rightBridge().isBuilt()) { + throw new IllegalArgumentException("Line의 끝은 사다리가 없어야 합니다."); } + + IntStream.range(1, points.size() - 1) + .filter(i -> points.get(i).leftBridge().isBuilt() && points.get(i + 1).leftBridge().isBuilt()) + .findAny() + .ifPresent(i -> { + throw new IllegalArgumentException("Line에서 연속된 사다리가 있으면 안됩니다."); + }); + + IntStream.range(0, points.size() - 2) + .filter(i -> points.get(i).rightBridge().isBuilt() && points.get(i + 1).rightBridge().isBuilt()) + .findAny() + .ifPresent(i -> { + throw new IllegalArgumentException("Line에서 연속된 사다리가 있으면 안됩니다."); + }); } - public void createLadders() { - IntStream.range(1, points.size()) - .filter(i -> !points.get(i-1).bridge().isBuilt()) - .filter(i -> RANDOM.nextBoolean()) - .forEach(i -> points.get(i).createBridge()); + public void createRandomBridges() { + IntStream.range(1, points.size()).filter(i -> !points.get(i - 1).leftBridge().isBuilt()) + .filter(i -> RANDOM.nextBoolean()).forEach(i -> { + points.get(i).createLeftBridge(); + points.get(i - 1).createRightBridge(); + }); + } + + public void createLeftBridge(int index) { + points.get(index).createLeftBridge(); + points.get(index - 1).createRightBridge(); + validate(points); } } diff --git a/src/main/java/nextstep/ladder/module/Name.java b/src/main/java/nextstep/ladder/module/Name.java index ded4cc8740..f291d141b1 100644 --- a/src/main/java/nextstep/ladder/module/Name.java +++ b/src/main/java/nextstep/ladder/module/Name.java @@ -7,7 +7,7 @@ public class Name { private final String name; public Name(String name) { - validate(name); + validateName(name); this.name = name; } @@ -15,7 +15,7 @@ public String value() { return name; } - private void validate(String name) { + private void validateName(String name) { if (name == null || name.isEmpty()) { throw new IllegalArgumentException("이름은 빈 문자열이 될 수 없습니다."); } diff --git a/src/main/java/nextstep/ladder/module/NameList.java b/src/main/java/nextstep/ladder/module/NameList.java index 23ef001442..1730c940f1 100644 --- a/src/main/java/nextstep/ladder/module/NameList.java +++ b/src/main/java/nextstep/ladder/module/NameList.java @@ -8,7 +8,7 @@ public class NameList implements Iterable { private final List names; public NameList(List names) { - validate(names); + validateNameList(names); this.names = names.stream().map(Name::new).collect(Collectors.toList()); } @@ -20,12 +20,16 @@ public int size() { return names.size(); } + public Name get(int index) { + return names.get(index); + } + @Override public Iterator iterator() { return names.iterator(); } - private void validate(List names) { + private void validateNameList(List names) { if (names == null || names.isEmpty()) { throw new IllegalArgumentException("이름 리스트는 비어있을 수 없습니다."); } diff --git a/src/main/java/nextstep/ladder/module/Point.java b/src/main/java/nextstep/ladder/module/Point.java index 1ba18e6e04..1712131615 100644 --- a/src/main/java/nextstep/ladder/module/Point.java +++ b/src/main/java/nextstep/ladder/module/Point.java @@ -4,36 +4,73 @@ public class Point implements Comparable { private final int x; - private Bridge bridge; + private LeftBridge leftBridge; + private RightBridge rightBridge; public Point(int x) { - this.x = x; - this.bridge = new Bridge(false); + this(x, new LeftBridge(false), new RightBridge(false)); + } + + public Point(int x, boolean leftBridge, boolean rightBridge) { + this(x, new LeftBridge(leftBridge), new RightBridge(rightBridge)); + } + + public Point(int x, LeftBridge leftBridge) { + this(x, leftBridge, new RightBridge(false)); } - public Point(int x, Bridge ladder) { - validate(x); + public Point(int x, RightBridge rightBridge) { + this(x, new LeftBridge(false), rightBridge); + } + + public Point(int x, LeftBridge leftBridge, RightBridge rightBridge) { + validatePoint(x); this.x = x; - this.bridge = ladder; + this.leftBridge = leftBridge; + this.rightBridge = rightBridge; } public int value() { return x; } - public Bridge bridge() { - return bridge; + public LeftBridge leftBridge() { + return leftBridge; + } + + public RightBridge rightBridge() { + return rightBridge; } - public void createBridge() { - bridge = new Bridge(true); + public void createLeftBridge() { + leftBridge = new LeftBridge(true); + validatePoint(); } - public void destroyBridge() { - bridge = new Bridge(false); + public void createRightBridge() { + rightBridge = new RightBridge(true); + validatePoint(); + } + + public void destroyLeftBridge() { + leftBridge = new LeftBridge(false); + } + + public void destroyRightBridge() { + rightBridge = new RightBridge(false); + } + + private void validatePoint() { + if (x == 0 && leftBridge.isBuilt()) { + throw new IllegalArgumentException("Line의 시작은 사다리가 없어야 합니다."); + } + + if (leftBridge.isBuilt() && rightBridge.isBuilt()) { + throw new IllegalArgumentException("Point에서 양쪽 사다리가 있으면 안됩니다."); + } } - private void validate(int x) { + private void validatePoint(int x) { if (x < 0) { throw new IllegalArgumentException("x는 0 이상이어야 합니다."); } diff --git a/src/main/java/nextstep/ladder/module/PointList.java b/src/main/java/nextstep/ladder/module/PointList.java index 649fbf35f7..851752d8ea 100644 --- a/src/main/java/nextstep/ladder/module/PointList.java +++ b/src/main/java/nextstep/ladder/module/PointList.java @@ -16,7 +16,7 @@ public PointList(int i) { public List points() { return points; } - + public Point get(int i) { return points.get(i); } diff --git a/src/main/java/nextstep/ladder/module/Result.java b/src/main/java/nextstep/ladder/module/Result.java new file mode 100644 index 0000000000..b1d4cd6ccb --- /dev/null +++ b/src/main/java/nextstep/ladder/module/Result.java @@ -0,0 +1,46 @@ +package nextstep.ladder.module; + +import java.util.Objects; + +public class Result { + + private final String result; + + public Result(String result) { + validateResult(result); + this.result = result; + } + + public String value() { + return result; + } + + private void validateResult(String result) { + if (result == null || result.isEmpty()) { + throw new IllegalArgumentException("결과는 비어있을 수 없습니다."); + } + + if (result.isBlank()) { + throw new IllegalArgumentException("결과는 공백이 될 수 없습니다."); + } + + if (result.length() > 5) { + throw new IllegalArgumentException("결과는 5자를 초과할 수 없습니다."); + } + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + Result result = (Result) obj; + return this.result.equals(result.result); + } + + @Override + public int hashCode() { + return Objects.hash(result); + } +} diff --git a/src/main/java/nextstep/ladder/module/ResultList.java b/src/main/java/nextstep/ladder/module/ResultList.java new file mode 100644 index 0000000000..fce8ac6dad --- /dev/null +++ b/src/main/java/nextstep/ladder/module/ResultList.java @@ -0,0 +1,37 @@ +package nextstep.ladder.module; + +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; + +public class ResultList implements Iterable { + private final List results; + + public ResultList(List results) { + validateResultList(results); + this.results = results.stream().map(Result::new).collect(Collectors.toList()); + } + + public List value() { + return results; + } + + public int size() { + return results.size(); + } + + public Result get(int index) { + return results.get(index); + } + + @Override + public Iterator iterator() { + return results.iterator(); + } + + private void validateResultList(List results) { + if (results == null || results.isEmpty()) { + throw new IllegalArgumentException("결과 리스트는 비어있을 수 없습니다."); + } + } +} \ No newline at end of file diff --git a/src/main/java/nextstep/ladder/module/RightBridge.java b/src/main/java/nextstep/ladder/module/RightBridge.java new file mode 100644 index 0000000000..33c6e190ce --- /dev/null +++ b/src/main/java/nextstep/ladder/module/RightBridge.java @@ -0,0 +1,18 @@ +package nextstep.ladder.module; + +public class RightBridge { + + private final boolean isBuilt; + + public RightBridge() { + this(false); + } + + public RightBridge(boolean isBuilt) { + this.isBuilt = isBuilt; + } + + public boolean isBuilt() { + return isBuilt; + } +} diff --git a/src/main/java/nextstep/ladder/view/InputView.java b/src/main/java/nextstep/ladder/view/InputView.java index 124cc3c44f..075226a727 100644 --- a/src/main/java/nextstep/ladder/view/InputView.java +++ b/src/main/java/nextstep/ladder/view/InputView.java @@ -14,10 +14,22 @@ public List getPeopleNames() { return Arrays.asList(input.split(",")); } + public List getResultNames() { + System.out.println(); + System.out.println("실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요)"); + String input = scanner.nextLine(); + return Arrays.asList(input.split(",")); + } + public int getHeight() { System.out.println(); System.out.println("최대 사다리 높이는 몇 개인가요?"); - return scanner.nextInt(); + return Integer.parseInt(scanner.nextLine()); } + public String getWantedName() { + System.out.println(); + System.out.println("결과를 보고 싶은 사람은?"); + return scanner.nextLine(); + } } diff --git a/src/main/java/nextstep/ladder/view/ResultView.java b/src/main/java/nextstep/ladder/view/ResultView.java index 08395ba02d..39ad248dc6 100644 --- a/src/main/java/nextstep/ladder/view/ResultView.java +++ b/src/main/java/nextstep/ladder/view/ResultView.java @@ -1,9 +1,14 @@ package nextstep.ladder.view; +import java.util.Map; + import nextstep.ladder.module.Board; +import nextstep.ladder.module.BoardResult; import nextstep.ladder.module.Line; import nextstep.ladder.module.Name; import nextstep.ladder.module.Point; +import nextstep.ladder.module.Result; +import nextstep.ladder.module.ResultList; public class ResultView { @@ -17,7 +22,14 @@ public void printBoard(Board board) { private void printPeopleNames(Board board) { for (Name name : board.names()) { - System.out.printf("%5s ", name); + System.out.printf("%5s ", name.value()); + } + System.out.println(); + } + + public void printResultNames(ResultList resultNames) { + for (Result result : resultNames) { + System.out.printf("%5s ", result.value()); } System.out.println(); } @@ -36,6 +48,18 @@ private void printLine(Line line) { } public void printPoint(Point point) { - System.out.printf("%5s", point.bridge().isBuilt() ? "-----|" : " |"); + System.out.printf("%5s", point.leftBridge().isBuilt() ? "-----|" : " |"); + } + + public void printResults(Name wantedName, BoardResult boardResult) { + System.out.println(); + System.out.println("실행 결과"); + if (wantedName.equals(new Name("all"))) { + for (Map.Entry entry : boardResult.all().entrySet()) { + System.out.println(entry.getKey().value() + " : " + entry.getValue().value()); + } + return; + } + System.out.println(boardResult.of(wantedName).value()); } } diff --git a/src/test/java/nextstep/ladder/module/GameTest.java b/src/test/java/nextstep/ladder/module/GameTest.java new file mode 100644 index 0000000000..d23d8a67ea --- /dev/null +++ b/src/test/java/nextstep/ladder/module/GameTest.java @@ -0,0 +1,61 @@ +package nextstep.ladder.module; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import nextstep.ladder.controller.Game; + +public class GameTest { + @Test + @DisplayName("게임 결과 테스트 #1") + public void test() { + NameList nameList = new NameList(Arrays.asList("a", "b", "c")); + ResultList resultList = new ResultList(Arrays.asList("1", "2", "3")); + Height height = new Height(3); + Line line1 = new Line(new PointList(3)); + Line line2 = new Line(new PointList(3)); + Line line3 = new Line(new PointList(3)); + line1.createLeftBridge(1); // |-| | + line2.createLeftBridge(2); // | |-| + line3.createLeftBridge(2); // | |-| + + Board board = new Board(Arrays.asList(line1, line2, line3), nameList); + + Game game = new Game(nameList, resultList, height); + BoardResult boardResult = game.play(board); + + assertThat(boardResult.of(new Name("a"))).isEqualTo(new Result("2")); + assertThat(boardResult.of(new Name("b"))).isEqualTo(new Result("1")); + assertThat(boardResult.of(new Name("c"))).isEqualTo(new Result("3")); + } + + @Test + @DisplayName("게임 결과 테스트 #2") + public void test2() { + NameList nameList = new NameList(Arrays.asList("a", "b", "c", "d")); + ResultList resultList = new ResultList(Arrays.asList("1", "2", "3", "4")); + Height height = new Height(4); + Line line1 = new Line(new PointList(4)); + Line line2 = new Line(new PointList(4)); + Line line3 = new Line(new PointList(4)); + Line line4 = new Line(new PointList(4)); + line1.createLeftBridge(1); // |-| | | + line2.createLeftBridge(2); // | |-| | + line3.createLeftBridge(3); // | | |-| + line4.createLeftBridge(2); // | |-| | + + Board board = new Board(Arrays.asList(line1, line2, line3, line4), nameList); + + Game game = new Game(nameList, resultList, height); + BoardResult boardResult = game.play(board); + + assertThat(boardResult.of(new Name("a"))).isEqualTo(new Result("4")); + assertThat(boardResult.of(new Name("b"))).isEqualTo(new Result("1")); + assertThat(boardResult.of(new Name("c"))).isEqualTo(new Result("3")); + assertThat(boardResult.of(new Name("d"))).isEqualTo(new Result("2")); + } +} diff --git a/src/test/java/nextstep/ladder/module/LineTest.java b/src/test/java/nextstep/ladder/module/LineTest.java index 66ecd7a937..62ef1b9136 100644 --- a/src/test/java/nextstep/ladder/module/LineTest.java +++ b/src/test/java/nextstep/ladder/module/LineTest.java @@ -1,6 +1,5 @@ package nextstep.ladder.module; -import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import org.junit.jupiter.api.DisplayName; @@ -8,43 +7,19 @@ public class LineTest { - @Test - @DisplayName("Line의 시작과 끝이 0과 (n-1)이면 통과") - void givenPointXsWithStartAndEndZeroAndNMinusOne_whenCreateLine_thenPass() { - PointList points = new PointList(3); - - assertThat(new Line(points).points()).isEqualTo(points); - } - @Test @DisplayName("Line의 시작에는 사다리가 없어야함") void givenLineWithBridgeAtStart_whenCreateLine_thenThrowException() { - PointList points = new PointList(3); - points.get(0).createBridge(); - points.get(1).createBridge(); - points.get(2).createBridge(); + Line line = new Line(new PointList(3)); - assertThatThrownBy(() -> new Line(points)).isInstanceOf(IllegalArgumentException.class) + assertThatThrownBy(() -> line.createLeftBridge(0)).isInstanceOf(IllegalArgumentException.class) .hasMessage("Line의 시작은 사다리가 없어야 합니다."); } - @Test - @DisplayName("Line에서 연속된 사다리가 있으면 안됨") - void givenLineWithConsecutiveBridges_whenCreateLine_thenThrowException() { - PointList points = new PointList(4); - points.get(1).createBridge(); - points.get(2).createBridge(); - - assertThatThrownBy(() -> new Line(points)).isInstanceOf(IllegalArgumentException.class) - .hasMessage("Line에서 연속된 사다리가 있으면 안됩니다."); - } - @Test @DisplayName("Line의 크기가 2보다 작으면 에러") void givenLineWithSizeLessThanTwo_whenCreateLine_thenThrowException() { - PointList points = new PointList(1); - - assertThatThrownBy(() -> new Line(points)).isInstanceOf(IllegalArgumentException.class) + assertThatThrownBy(() -> new Line(new PointList(1))).isInstanceOf(IllegalArgumentException.class) .hasMessage("Line의 크기는 2 이상이어야 합니다."); } } diff --git a/src/test/java/nextstep/ladder/module/PointTest.java b/src/test/java/nextstep/ladder/module/PointTest.java new file mode 100644 index 0000000000..3e43f5e92a --- /dev/null +++ b/src/test/java/nextstep/ladder/module/PointTest.java @@ -0,0 +1,33 @@ +package nextstep.ladder.module; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class PointTest { + + @Test + @DisplayName("x가 0 미만이면 에러") + void givenNegativePosition_whenCreatePoint_thenThrowException() { + assertThatThrownBy(() -> new Point(-1, new LeftBridge())).isInstanceOf(IllegalArgumentException.class) + .hasMessage("x는 0 이상이어야 합니다."); + } + + @Test + @DisplayName("x가 0 이상이면 통과") + void givenPosition_whenCreatePoint_thenReturnValue() { + assertThat(new Point(0, new LeftBridge()).value()).isEqualTo(0); + } + + @Test + @DisplayName("양쪽에 연속된 사다리가 있으면 안됨") + void givenLineWithConsecutiveBridges_whenCreateLine_thenThrowException() { + Point point = new Point(1); + point.createLeftBridge(); + + assertThatThrownBy(() -> point.createRightBridge()).isInstanceOf(IllegalArgumentException.class) + .hasMessage("Point에서 양쪽 사다리가 있으면 안됩니다."); + } +} diff --git a/src/test/java/nextstep/ladder/module/PointXTest.java b/src/test/java/nextstep/ladder/module/PointXTest.java deleted file mode 100644 index ddccc3f10f..0000000000 --- a/src/test/java/nextstep/ladder/module/PointXTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package nextstep.ladder.module; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; - -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import nextstep.ladder.view.ResultView; - -public class PointXTest { - - private final ResultView resultView = new ResultView(); - private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - - @Test - @DisplayName("x가 0 미만이면 에러") - void givenXLessThanZero_whenCreatePointX_thenThrowException() { - assertThatThrownBy(() -> new Point(-1, new Bridge())).isInstanceOf(IllegalArgumentException.class) - .hasMessage("x는 0 이상이어야 합니다."); - } - - @Test - @DisplayName("x가 0 이상이면 통과") - void givenXGreaterThanOrEqualToZero_whenCreatePointX_thenPass() { - assertThat(new Point(0, new Bridge()).value()).isEqualTo(0); - } - - @Test - @DisplayName("Bridge 가 있을 때 출력 점검") - void givenBridge_whenToString_thenPrintBridge() { - Point point = new Point(0, new Bridge(true)); - System.setOut(new PrintStream(outputStream)); - resultView.printPoint(point); - assertThat(outputStream.toString()).isEqualTo("-----|"); - } - - @Test - @DisplayName("Bridge 가 없을 때 출력 점검") - void givenNoBridge_whenToString_thenPrintNoBridge() { - Point point = new Point(0); - System.setOut(new PrintStream(outputStream)); - resultView.printPoint(point); - assertThat(outputStream.toString()).isEqualTo(" |"); - } - -}