diff --git a/README-HS.md b/README-HS.md new file mode 100644 index 0000000..a6ca8a7 --- /dev/null +++ b/README-HS.md @@ -0,0 +1,79 @@ +## 요구사항 +1. 좌표값을 두 개 입력한 경우 두 점을 잇는 직선으로 가정 +2. 좌표와 좌표값 사이 '-' 문자로 구분 +3. 좌표값을 네 개 입력한 경우 네 점을 연결하는 사각형으로 가정 + - 네 점이 뒤틀어진 사다리꼴이나 마름모는 제외하고 직사각형만 허용하도록 검사 + - 사각형인 경우 사각형 넓이를 계산해서 출력 +4. 좌표값을 세 개 입력한 경우, 세 점을 연결하는 삼각형으로 가정한다. +5. 삼각형인 경우 삼각형의 넓이를 계산해서 출력한다. + + +## 프로그래밍 요구사항 +1. depth 2를 넘지 않도록 구현 (1까지만 허용) +2. 3항 연산자 금지 +3. else 예약어 금지 +4. switch/case 금지 +5. 메소드 10줄 넘어가지 않도록 구현 +6. 일급 컬렉션 + + +## 실행 결과 +``` +좌표를 입력하세요. +(10,10)-(14,15)-(20,8) + + +24| + | +22| + | +20| + | +18| + | +16| + | ● +14| + | +12| + | +10| ● + | + 8| ● + | + 6| + | + 4| + | + 2| + | + +―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― + 0 2 4 6 8 10 12 14 16 18 20 22 24 + +삼각형의 넓이는 29.0 +``` + +## 힌트 +1. 사각형 면적은 width * height 방식으로 계산할 수 있다. +2. Point 라는 객체를 추가해 x, y 좌표를 관리하도록 한다. + +- 직사각형 좌표 + (10,10)-(22,10)-(22,18)-(10,18) + (2,3)-(2,10)-(7,3)-(7,10) + (4,6)-(4,15)-(12,6)-(12,15) + +- 직사각형이 아닌 좌표 + (3,5)-(7,14)-(15,18)-(21,3) + (2,8)-(9,17)-(18,6)-(23,11) + +- 마름모 + (12,6)-(18,18)-(6,18)-(0,6) + (6,12)-(12,18)-(18,12)-(12,6) + +- 선 + (10,10)-(14,15) + 두 점 사이 거리는 6.403124 + +(10,10)-(14,15) +(10,10)-(22,10)-(22,18) +(10,10)-(22,10)-(22,18)-(10,18) \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0f80bbf..d2880ba 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/CoordinateMain.java b/src/main/java/CoordinateMain.java new file mode 100644 index 0000000..25113ba --- /dev/null +++ b/src/main/java/CoordinateMain.java @@ -0,0 +1,15 @@ +import io.InputScanner; +import io.ResultView; +import model.Figure; + +public class CoordinateMain { + public static void main(String[] args) { + InputScanner scanner = new InputScanner(); + Figure figure = scanner.input(); + + double result = figure.calculateResult(); + + ResultView view = new ResultView(figure, result); + view.print(); + } +} diff --git a/src/main/java/enumclass/FigureType.java b/src/main/java/enumclass/FigureType.java new file mode 100644 index 0000000..a17b293 --- /dev/null +++ b/src/main/java/enumclass/FigureType.java @@ -0,0 +1,37 @@ +package enumclass; + +import model.*; + +public enum FigureType { + LINE(2){ + @Override + public Figure of(Points points) { + return new Line(points); + } + }, + TRIANGLE(3){ + @Override + public Figure of(Points points) { + return new Triangle(points); + } + }, + RECTANGLE(4){ + @Override + public Figure of(Points points) { + return new Rectangle(points); + } + }; + + private final int pointNum; + public abstract Figure of(Points points); + + FigureType(int pointNum) { + this.pointNum = pointNum; + } + + public int getPointNum(){ + return pointNum; + } + + +} diff --git a/src/main/java/io/InputScanner.java b/src/main/java/io/InputScanner.java new file mode 100644 index 0000000..d4ccfc7 --- /dev/null +++ b/src/main/java/io/InputScanner.java @@ -0,0 +1,30 @@ +package io; + +import model.Figure; +import validator.FigureValidator; + +import java.util.Scanner; + +public class InputScanner { + private final Scanner scanner; + + public InputScanner(){ + scanner = new Scanner(System.in); + } + + public Figure input(){ + System.out.println("좌표를 입력하세요."); + return validateInput(scanner.nextLine()); + } + + public Figure validateInput(String input){ + try{ + return FigureValidator.validate(input); + } catch(IllegalArgumentException ex){ + System.out.println(ex.getMessage()); + return input(); + } + } + + +} diff --git a/src/main/java/io/ResultView.java b/src/main/java/io/ResultView.java new file mode 100644 index 0000000..bc04569 --- /dev/null +++ b/src/main/java/io/ResultView.java @@ -0,0 +1,27 @@ +package io; + +import model.Figure; +import model.Graph; + +public class ResultView { + private Figure figure; + private Graph graph; + private double result; + + public ResultView(Figure figure, double result){ + this.figure = figure; + this.graph = Graph.from(figure); + this.result = result; + } + + public void print(){ + StringBuilder[] graphDrawing = graph.draw(); + + for (StringBuilder drawing : graphDrawing){ + System.out.println(drawing.toString()); + } + + System.out.println(figure.printResult(result)); + } + +} diff --git a/src/main/java/messages/ErrorMessages.java b/src/main/java/messages/ErrorMessages.java new file mode 100644 index 0000000..5a18365 --- /dev/null +++ b/src/main/java/messages/ErrorMessages.java @@ -0,0 +1,9 @@ +package messages; + +public class ErrorMessages { + public static final String INVALID_PATTERN = "입력이 올바르지 않습니다. 다시 입력해주세요."; + public static final String INVALID_NUMBER = "숫자가 아닌 값은 입력할 수 없습니다. 다시 입력해주세요."; + public static final String INVALID_RECTANGLE = "직사각형이 아닌 좌표는 입력할 수 없습니다. 다시 입력해주세요."; + public static final String INVALID_RANGE = "좌표값은 0부터 24까지만 입력 가능합니다. 다시 입력해주세요."; + +} diff --git a/src/main/java/model/Figure.java b/src/main/java/model/Figure.java new file mode 100644 index 0000000..3f39ae8 --- /dev/null +++ b/src/main/java/model/Figure.java @@ -0,0 +1,51 @@ +package model; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +public abstract class Figure { + private static final int SQUARE_EXPONENT = 2; + + protected Points points; + + public Figure(Points points){ + this.points = points; + } + + public abstract double calculateResult(); + public abstract String printResult(double result); + + + public List calculateAllLength(){ + List lineLengths = new ArrayList<>(); + + // TODO + for(int i=0; i numbers = CoordinateUtils.splitStringToInteger(input); + Points points = Points.from(numbers); + return type.of(points); + } + +} diff --git a/src/main/java/model/Graph.java b/src/main/java/model/Graph.java new file mode 100644 index 0000000..b010f07 --- /dev/null +++ b/src/main/java/model/Graph.java @@ -0,0 +1,77 @@ +package model; + +public class Graph { + private final static int TOTAL_X_SIZE = 48; + private final static int TOTAL_Y_SIZE = 26; + private final static int X_LINE = 24; + private final static int X_NUMBER_LINE = 25; + private final static int MAX_NUMBER = 24; + + private Figure figure; + private StringBuilder[] graph; + + public Graph(Figure figure){ + this.figure = figure; + initGraph(); + } + + public void initGraph(){ + graph = new StringBuilder[TOTAL_Y_SIZE]; + + for (int i=0; i<=X_LINE; i++){ + graph[i] = new StringBuilder(" ".repeat(TOTAL_X_SIZE)); + } + } + + public static Graph from(Figure figure){ + return new Graph(figure); + } + + public StringBuilder[] draw(){ + drawY(); + drawX(); + figure.draw(graph); + + return graph; + } + + + public void drawY(){ + int yNum = MAX_NUMBER; + + for(int i=0; i points; + + public Points(List points){ + this.points = points; + } + + public static Points from(List numbers){ + List points = new ArrayList<>(); + + for(int i=0; i linesLength; + + public Rectangle(Points points) { + super(points); + this.linesLength = calculateAllLength(); + FigureValidator.validateRectangle(linesLength); + } + + + @Override + public double calculateResult() { + double area = linesLength.get(WIDTH_INDEX) * linesLength.get(HEIGHT_INDEX); + return Math.round(area * 100.0) / 100.0; + } + + @Override + public String printResult(double result) { + return "사각형의 넓이는 " + result; + } + + + +} diff --git a/src/main/java/model/Triangle.java b/src/main/java/model/Triangle.java new file mode 100644 index 0000000..6faec66 --- /dev/null +++ b/src/main/java/model/Triangle.java @@ -0,0 +1,30 @@ +package model; + +import java.util.List; + +public class Triangle extends Figure{ + private static final int SQUARE_EXPONENT = 2; + + private List linesLength; + + public Triangle(Points points) { + super(points); + this.linesLength = calculateAllLength(); + } + + @Override + public double calculateResult() { + double len1 = linesLength.get(0); + double len2 = linesLength.get(1); + double len3 = linesLength.get(2); + + double s = (len1 + len2 + len3) / SQUARE_EXPONENT; + double area = Math.sqrt(s * (s - len1) * (s - len2) * (s - len3)); + return Math.round(area * 100.0) / 100.0; + } + + @Override + public String printResult(double result) { + return "삼각형의 넓이는 " + result; + } +} diff --git a/src/main/java/util/CoordinateUtils.java b/src/main/java/util/CoordinateUtils.java new file mode 100644 index 0000000..c079302 --- /dev/null +++ b/src/main/java/util/CoordinateUtils.java @@ -0,0 +1,26 @@ +package util; + +import messages.ErrorMessages; + +import java.util.List; +import java.util.regex.MatchResult; +import java.util.regex.Pattern; + +public class CoordinateUtils { + public static Integer parseInteger(String str){ + try{ + return Integer.parseInt(str); + } catch (IllegalArgumentException ex){ + throw new IllegalArgumentException(ErrorMessages.INVALID_NUMBER); + } + } + + public static List splitStringToInteger(String str){ + return Pattern.compile("\\d+") + .matcher(str) + .results() + .map(MatchResult::group) + .map(CoordinateUtils::parseInteger) + .toList(); + } +} diff --git a/src/main/java/validator/FigureValidator.java b/src/main/java/validator/FigureValidator.java new file mode 100644 index 0000000..bfac893 --- /dev/null +++ b/src/main/java/validator/FigureValidator.java @@ -0,0 +1,67 @@ +package validator; + +import enumclass.FigureType; +import messages.ErrorMessages; +import model.Figure; +import model.FigureFactory; + +import java.util.List; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class FigureValidator { + private static final int MAX_COORDINATE = 24; + private static final int MIN_COORDINATE = 0; + + + public static Figure validate(String input){ + FigureType type = validatePattern(input); + return FigureFactory.createFigure(type, input); + + } + + public static FigureType validatePattern(String input){ + for(FigureType type : FigureType.values()){ + if(Pattern.matches(generatePattern(type.getPointNum()), input)){ + return type; + } + } + + throw new IllegalArgumentException(ErrorMessages.INVALID_PATTERN); + } + + public static String generatePattern(int pointNum){ + String pattern = "\\(\\d{1,2},\\d{1,2}\\)"; + + return IntStream.range(0, pointNum) + .mapToObj(i -> pattern) + .collect(Collectors.joining("-")); + } + + + public static void validateRange(int x, int y){ + if (!isCorrectRange(x) || !isCorrectRange(y)){ + throw new IllegalArgumentException(ErrorMessages.INVALID_RANGE); + } + } + + public static boolean isCorrectRange(int value){ + return value <= MAX_COORDINATE && value >= MIN_COORDINATE; + } + + + public static void validateRectangle(List linesLength){ + if (!isRectangle(linesLength)){ + throw new IllegalArgumentException(ErrorMessages.INVALID_RECTANGLE); + } + } + + public static boolean isRectangle(List linesLength){ + return linesLength.get(0).equals(linesLength.get(1)) + && linesLength.get(2).equals(linesLength.get(3)) + && linesLength.get(4).equals(linesLength.get(5)) + && !linesLength.get(0).equals(linesLength.get(2)); + } + +} diff --git a/src/test/java/model/FigureFactoryTest.java b/src/test/java/model/FigureFactoryTest.java new file mode 100644 index 0000000..f8619a6 --- /dev/null +++ b/src/test/java/model/FigureFactoryTest.java @@ -0,0 +1,67 @@ +package model; + +import enumclass.FigureType; +import messages.ErrorMessages; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import validator.FigureValidator; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class FigureFactoryTest { + + @Test + @DisplayName("Line 객체 생성") + void createFigureLine(){ + // given, when + Figure response = FigureFactory.createFigure(FigureType.LINE, "(10,0)-(24,10)"); + + // then + assertThat(response.points.size()).isEqualTo(2); + } + + @Test + @DisplayName("Triangle 객체 생성") + void createFigureTriangle(){ + // given, when + Figure response = FigureFactory.createFigure(FigureType.TRIANGLE, "(10,0)-(24,10)-(14,15)"); + + assertThat(response.points.size()).isEqualTo(3); + } + + @Test + @DisplayName("Rectangle 객체 생성") + void createFigureRectangle(){ + // given, when + Figure response = FigureFactory.createFigure(FigureType.TRIANGLE, "(10,0)-(24,10)-(14,15)-(5,20)"); + + assertThat(response.points.size()).isEqualTo(4); + } + + @Test + @DisplayName("직사각형 유효성 검사 시 마름모로 예외 발생") + void createFigureRectangle_diamond() { + // given, when + IllegalArgumentException fail = assertThrows(IllegalArgumentException.class, + () -> FigureFactory.createFigure(FigureType.RECTANGLE, "(12,6)-(18,18)-(6,18)-(0,6)")); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_RECTANGLE); + + } + + + @Test + @DisplayName("직사각형 유효성 검사 시 직사각형이 아닌 도형으로 예외 발생") + void checkRectangleShapes_notRectangle() { + // given, when + IllegalArgumentException fail = assertThrows(IllegalArgumentException.class, + () -> FigureFactory.createFigure(FigureType.RECTANGLE, "(3,5)-(7,14)-(15,18)-(21,3)")); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_RECTANGLE); + } +} \ No newline at end of file diff --git a/src/test/java/model/FigureTest.java b/src/test/java/model/FigureTest.java new file mode 100644 index 0000000..90e4006 --- /dev/null +++ b/src/test/java/model/FigureTest.java @@ -0,0 +1,68 @@ +package model; + +import enumclass.FigureType; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class FigureTest { + + @Test + @DisplayName("모든 선의 길이 계산 - Line") + void calculateAllLength_line(){ + // given + Figure figure = FigureFactory.createFigure(FigureType.LINE, "(10,10)-(14,15)"); + + // when + List response = figure.calculateAllLength(); + + // then + assertThat(response.size()).isEqualTo(1); + assertThat(response.get(0)).isEqualTo(6.4031242374328485); + } + + @Test + @DisplayName("모든 선의 길이 계산 - Triangle") + void calculateAllLength_triangle(){ + // given + Figure figure = FigureFactory.createFigure(FigureType.TRIANGLE, "(10,10)-(14,15)-(24,0)"); + + // when + List response = figure.calculateAllLength(); + + // then + assertThat(response.size()).isEqualTo(3); + } + + @Test + @DisplayName("모든 선의 길이 계산 - Rectangle") + void calculateAllLength_rectangle(){ + // given + Figure figure = FigureFactory.createFigure(FigureType.RECTANGLE, "(10,10)-(22,10)-(22,18)-(10,18)"); + + // when + List response = figure.calculateAllLength(); + + // then + assertThat(response.size()).isEqualTo(6); + } + + @Test + @DisplayName("길이 계산") + void calculateLength(){ + // given + Figure figure = FigureFactory.createFigure(FigureType.LINE, "(10,10)-(14,15)"); + + // when + double response = figure.calculateDistance(new Point(10, 10), new Point(14, 15)); + + // then + assertThat(response).isEqualTo(6.4031242374328485); + } + + +} \ No newline at end of file diff --git a/src/test/java/model/LineTest.java b/src/test/java/model/LineTest.java new file mode 100644 index 0000000..76e88c8 --- /dev/null +++ b/src/test/java/model/LineTest.java @@ -0,0 +1,42 @@ +package model; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class LineTest { + + private Line line; + + @BeforeEach + void setUp(){ + Points points = Points.from(List.of(10, 10, 14, 15)); + line = new Line(points); + } + + @Test + @DisplayName("거리 계산") + void calculateResult(){ + // given, when + double response = line.calculateResult(); + + // then + assertThat(response).isEqualTo(6.4); + } + + @Test + @DisplayName("계산 결과 출력") + void printResult(){ + // given, when + String response = line.printResult(6.4); + + // then + assertThat(response).isEqualTo("두 점 사이 거리는 6.4"); + } + + +} \ No newline at end of file diff --git a/src/test/java/model/PointTest.java b/src/test/java/model/PointTest.java new file mode 100644 index 0000000..ae03cf1 --- /dev/null +++ b/src/test/java/model/PointTest.java @@ -0,0 +1,85 @@ +package model; + +import messages.ErrorMessages; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class PointTest { + @Test + @DisplayName("객체 생성") + void of(){ + // given, when, then + assertDoesNotThrow(() -> Point.of(24, 0)); + + } + + @Test + @DisplayName("객체 생성 시 x 좌표 범위 예외 발생") + void of_invalidateXRange(){ + // given, when + IllegalArgumentException fail = assertThrows(IllegalArgumentException.class, () -> Point.of(25, 0)); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_RANGE); + } + + @Test + @DisplayName("객체 생성 시 y 좌표 범위 예외 발생") + void of_invalidateYRange(){ + // given, when + IllegalArgumentException fail = assertThrows(IllegalArgumentException.class, () -> Point.of(24, -1)); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_RANGE); + } + + @Test + @DisplayName("x 좌표 뺄셈") + void minusX(){ + // given + Point point1 = Point.of(24, 0); + Point point2 = Point.of(0, 24); + + // when + double response = point1.minusX(point2); + + // then + assertThat(response).isEqualTo(24); + } + + @Test + @DisplayName("y 좌표 뺄셈") + void minusY(){ + // given + Point point1 = Point.of(24, 0); + Point point2 = Point.of(0, 24); + + // when + double response = point1.minusY(point2); + + // then + assertThat(response).isEqualTo(-24); + } + + @Test + @DisplayName("좌표 그리기") + void drawPoint(){ + // given + StringBuilder[] graph = new StringBuilder[1]; + graph[0] = new StringBuilder().append(" "); + + Point point = Point.of(0, 24); + + // when + point.drawPoint(graph); + + // then + assertThat(graph[0]).contains("●"); + + + } + +} \ No newline at end of file diff --git a/src/test/java/model/PointsTest.java b/src/test/java/model/PointsTest.java new file mode 100644 index 0000000..5bba9cc --- /dev/null +++ b/src/test/java/model/PointsTest.java @@ -0,0 +1,38 @@ +package model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class PointsTest { + @Test + @DisplayName("Points 객체 생성") + void from(){ + // given, when + Points response = Points.from(List.of(24, 5, 3, 15)); + + // then + assertThat(response.getPoint(0)).isEqualTo(Point.of(24, 5)); + assertThat(response.getPoint(1)).isEqualTo(Point.of(3, 15)); + } + + + + @Test + @DisplayName("Points 객체 사이즈 반환") + void size(){ + // given + Points points = Points.from(List.of(24, 3)); + + // when + int response = points.size(); + + // then + assertThat(response).isEqualTo(1); + } + +} \ No newline at end of file diff --git a/src/test/java/model/RectangleTest.java b/src/test/java/model/RectangleTest.java new file mode 100644 index 0000000..f0cea2e --- /dev/null +++ b/src/test/java/model/RectangleTest.java @@ -0,0 +1,44 @@ +package model; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class RectangleTest { + + private Rectangle rectangle; + + @BeforeEach + void setUp(){ + Points points = Points.from(List.of(10,10,22,10,22,18,10,18)); + rectangle = new Rectangle(points); + } + + @Test + @DisplayName("넓이 계산") + void calculateResult(){ + // given, when + double response = rectangle.calculateResult(); + + // then + assertThat(response).isEqualTo(96.0); + } + + @Test + @DisplayName("계산 결과 출력") + void printResult(){ + // given, when + String response = rectangle.printResult(96.0); + + // then + assertThat(response).isEqualTo("사각형의 넓이는 96.0"); + } + + + + +} \ No newline at end of file diff --git a/src/test/java/model/TriangleTest.java b/src/test/java/model/TriangleTest.java new file mode 100644 index 0000000..64ea70f --- /dev/null +++ b/src/test/java/model/TriangleTest.java @@ -0,0 +1,43 @@ +package model; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class TriangleTest { + + private Triangle triangle; + + @BeforeEach + void setUp(){ + Points points = Points.from(List.of(10,10,14,15,20,8)); + triangle = new Triangle(points); + } + + @Test + @DisplayName("넓이 계산") + void calculateResult(){ + // given, when + double response = triangle.calculateResult(); + + // then + assertThat(response).isEqualTo(29.0); + } + + @Test + @DisplayName("계산 결과 출력") + void printResult(){ + // given, when + String response = triangle.printResult(29.0); + + // then + assertThat(response).isEqualTo("삼각형의 넓이는 29.0"); + } + + +} \ No newline at end of file diff --git a/src/test/java/util/CoordinateUtilsTest.java b/src/test/java/util/CoordinateUtilsTest.java new file mode 100644 index 0000000..64b9bbf --- /dev/null +++ b/src/test/java/util/CoordinateUtilsTest.java @@ -0,0 +1,72 @@ +package util; + +import messages.ErrorMessages; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class CoordinateUtilsTest { + + @Test + @DisplayName("문자열 숫자로 변환") + void parseInteger(){ + // given, when + Integer response = CoordinateUtils.parseInteger("13"); + + // then + assertThat(response).isEqualTo(13); + } + + @Test + @DisplayName("문자열 숫자로 변환 시 예외 발생") + void parseIntegerNotNumber(){ + // given, when + IllegalArgumentException fail = assertThrows(IllegalArgumentException.class, () -> CoordinateUtils.parseInteger("문자열")); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_NUMBER); + } + + @Test + @DisplayName("문자열 숫자 리스트로 변환 - 직선") + void splitStringToInteger1(){ + // given, when + List response = CoordinateUtils.splitStringToInteger("(10,10)-(22,10)"); + + // then + assertThat(response.size()).isEqualTo(4); + assertThat(response.get(0)).isEqualTo(10); + assertThat(response.get(1)).isEqualTo(10); + assertThat(response.get(2)).isEqualTo(22); + assertThat(response.get(3)).isEqualTo(10); + } + + @Test + @DisplayName("문자열 숫자 리스트로 변환 - 직사각형") + void splitStringToInteger2(){ + // given, when + List response = CoordinateUtils.splitStringToInteger("(10,10)-(22,10)-(22,18)-(10,18)"); + + // then + assertThat(response.size()).isEqualTo(8); + assertThat(response.get(0)).isEqualTo(10); + assertThat(response.get(1)).isEqualTo(10); + assertThat(response.get(2)).isEqualTo(22); + assertThat(response.get(3)).isEqualTo(10); + } + + @Test + @DisplayName("문자열 숫자 리스트로 변환 시 숫자가 아닌 값으로 인해 리스트 사이즈 0") + void splitStringToIntegerNotNumber(){ + // given, when + List response = CoordinateUtils.splitStringToInteger("문자열"); + + // then + assertThat(response.size()).isEqualTo(0); + } + +} \ No newline at end of file diff --git a/src/test/java/validator/FigureValidatorTest.java b/src/test/java/validator/FigureValidatorTest.java new file mode 100644 index 0000000..2a07c4a --- /dev/null +++ b/src/test/java/validator/FigureValidatorTest.java @@ -0,0 +1,240 @@ +package validator; + +import enumclass.FigureType; +import messages.ErrorMessages; +import model.*; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class FigureValidatorTest { + +// @Test +// @DisplayName("입력값 유효성 검사 - 직선") +// void validateInput_line(){ +// // given, when +// Points response = scanner.validateInput("(10,10)-(22,10)"); +// +// // then +// assertThat(response.size()).isEqualTo(2); +// assertThat(response.getPoint(0)).isEqualTo(Point.of(10, 10)); +// assertThat(response.getPoint(1)).isEqualTo(Point.of(22, 10)); +// } +// +// +// @Test +// @DisplayName("입력값 유효성 검사 - 직사각형") +// void validateInput_rectangle(){ +// // given, when +// Points response = scanner.validateInput("(10,10)-(22,10)-(22,18)-(10,18)"); +// +// // then +// assertThat(response.size()).isEqualTo(4); +// assertThat(response.getPoint(0)).isEqualTo(Point.of(10, 10)); +// assertThat(response.getPoint(1)).isEqualTo(Point.of(22, 10)); +// assertThat(response.getPoint(2)).isEqualTo(Point.of(22, 18)); +// assertThat(response.getPoint(3)).isEqualTo(Point.of(10, 18)); +// } +// + @Test + @DisplayName("입력값 패턴 확인 - 직선") + void validatePattern_line(){ + // given, when + FigureType response = FigureValidator.validatePattern("(10,10)-(22,10)"); + + // then + assertThat(response).isEqualTo(FigureType.LINE); + } + + @Test + @DisplayName("입력값 패턴 맞지 않아 예외 발생 - 직선") + void InvalidatePattern_line(){ + // given, when + IllegalArgumentException fail = assertThrows(IllegalArgumentException.class, () -> FigureValidator.validatePattern("(10,10)-(22,")); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_PATTERN); + } + + @Test + @DisplayName("입력값 패턴 확인 - 삼각형") + void checkMatchPattern_triangle(){ + // given, when + FigureType response = FigureValidator.validatePattern("(10,10)-(22,10)-(22,18)"); + + // then + assertThat(response).isEqualTo(FigureType.TRIANGLE); + } + + + @Test + @DisplayName("입력값 패턴 맞지 않아 예외 발생 - 삼각형") + void misMatchPattern_triangle(){ + // given, when + IllegalArgumentException fail = assertThrows(IllegalArgumentException.class, + () -> FigureValidator.validatePattern("(10,10)-(22,10)-(22)")); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_PATTERN); + } + + @Test + @DisplayName("입력값 패턴 확인 - 사각형") + void checkMatchPattern_rectangle(){ + // given, when + FigureType response = FigureValidator.validatePattern("(10,10)-(22,10)-(22,18)-(10,18)"); + + // then + assertThat(response).isEqualTo(FigureType.RECTANGLE); + } + + + @Test + @DisplayName("입력값 패턴 맞지 않아 예외 발생 - 사각형") + void misMatchPattern_rectangle(){ + // given, when + IllegalArgumentException fail = assertThrows(IllegalArgumentException.class, + () -> FigureValidator.validatePattern("(10,10)-(22,10)-(22,18)-(10,18)-")); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_PATTERN); + } + + @Test + @DisplayName("직선 정규식 생성") + void generatePattern_line(){ + // given, when + String response = FigureValidator.generatePattern(2); + + // then + assertThat(response).isEqualTo("\\(\\d{1,2},\\d{1,2}\\)-\\(\\d{1,2},\\d{1,2}\\)"); + } + + @Test + @DisplayName("삼각형 정규식 생성") + void generatePattern_triangle(){ + // given, when + String response = FigureValidator.generatePattern(3); + + // then + assertThat(response).isEqualTo("\\(\\d{1,2},\\d{1,2}\\)-\\(\\d{1,2},\\d{1,2}\\)-\\(\\d{1,2},\\d{1,2}\\)"); + } + + @Test + @DisplayName("x, y 좌표 범위 유효성 체크") + void validateRange(){ + // given, when, then + assertDoesNotThrow(() -> FigureValidator.validateRange(24, 0)); + + } + + @Test + @DisplayName("x, y 좌표 범위 유효성 체크 시 x 좌표 예외 발생") + void InvalidateXRange(){ + // given, when + IllegalArgumentException fail = assertThrows(IllegalArgumentException.class, () -> FigureValidator.validateRange(25, 0)); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_RANGE); + } + + @Test + @DisplayName("x, y 좌표 범위 유효성 체크 시 y 좌표 예외 발생") + void InvalidateYRange(){ + // given, when + IllegalArgumentException fail = assertThrows(IllegalArgumentException.class, () -> FigureValidator.validateRange(24, -1)); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_RANGE); + } + + @Test + @DisplayName("사각형 정규식 생성") + void generatePattern_rectangle(){ + // given, when + String response = FigureValidator.generatePattern(4); + + // then + assertThat(response).isEqualTo("\\(\\d{1,2},\\d{1,2}\\)-\\(\\d{1,2},\\d{1,2}\\)-\\(\\d{1,2},\\d{1,2}\\)-\\(\\d{1,2},\\d{1,2}\\)"); + } + + + @Test + @DisplayName("범위 체크 시 true 반환") + void isCorrectRange_true(){ + // given, when + boolean response = FigureValidator.isCorrectRange(24); + + // then + assertThat(response).isTrue(); + + } + + @Test + @DisplayName("범위 체크 시 false 반환") + void isCorrectRange_false(){ + // given, when + boolean response = FigureValidator.isCorrectRange(25); + + // then + assertThat(response).isFalse(); + } + + @Test + @DisplayName("직사각형 유효성 검사") + void validateRectangle() { + // given + Figure figure = FigureFactory.createFigure(FigureType.RECTANGLE, "(10,10)-(22,10)-(22,18)-(10,18)"); + List allLength = figure.calculateAllLength(); + + // when + assertDoesNotThrow(() -> FigureValidator.validateRectangle(allLength)); + } + + @Test + @DisplayName("직사각형 유효성 검사 시 예외 발생") + void validateRectangle_notRectangle() { + // given + List allLength = List.of(15.0,10.0,20.0,20.0,30.0,30.0); + + // when + IllegalArgumentException fail = assertThrows(IllegalArgumentException.class, () -> FigureValidator.validateRectangle(allLength)); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_RECTANGLE); + + } + + + @Test + @DisplayName("직사각형 여부 true 반환") + void isRectangle_true() { + // given + Figure figure = FigureFactory.createFigure(FigureType.RECTANGLE, "(10,10)-(22,10)-(22,18)-(10,18)"); + List allLength = figure.calculateAllLength(); + // when + boolean response = FigureValidator.isRectangle(allLength); + + // then + assertThat(response).isTrue(); + } + + @Test + @DisplayName("직사각형 여부 false 반환") + void isRectangle_false() { + // given + List allLength = List.of(15.0,10.0,20.0,20.0,30.0,30.0); + + // when + boolean response = FigureValidator.isRectangle(allLength); + + + // then + assertThat(response).isFalse(); + } + +} \ No newline at end of file