diff --git a/README.md b/README.md index 8fe71120..92485046 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,101 @@ -## [NEXTSTEP 플레이그라운드의 미션 진행 과정](https://github.com/next-step/nextstep-docs/blob/master/playground/README.md) +# 좌표 계산기 ---- -## 학습 효과를 높이기 위해 추천하는 미션 진행 방법 +## 선 길이 ---- -1. 피드백 강의 전까지 미션 진행 -> 피드백 강의 전까지 혼자 힘으로 미션 진행. 미션을 진행하면서 하나의 작업이 끝날 때 마다 add, commit -> 예를 들어 다음 숫자 야구 게임의 경우 0, 1, 2단계까지 구현을 완료한 후 push +### 기능 요구사항 -![mission baseball](https://raw.githubusercontent.com/next-step/nextstep-docs/master/playground/images/mission_baseball.png) +- 사용자가 점에 대한 좌표 정보를 입력하는 메뉴를 구성한다. +- 좌표 정보는 괄호"(", ")"로 둘러쌓여 있으며 쉼표(,)로 x값과 y값을 구분한다. +- X, Y좌표 모두 최대 24까지만 입력할 수 있다. +- 입력 범위를 초과할 경우 에러 문구를 출력하고 다시 입력을 받는다. +- 정상적인 좌표값을 입력한 경우, 해당 좌표에 특수문자를 표시한다. +- 좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. +- 직선인 경우는 두 점 사이 거리를 계산해서 출력한다. ---- -2. 피드백 앞 단계까지 미션 구현을 완료한 후 피드백 강의를 학습한다. +### 이벤트 ---- -3. Git 브랜치를 master 또는 main으로 변경한 후 피드백을 반영하기 위한 새로운 브랜치를 생성한 후 처음부터 다시 미션 구현을 도전한다. +1. 사용자가 식을 입력했다. +2. 식이 계산됐다. -``` -git branch -a // 모든 로컬 브랜치 확인 -git checkout master // 기본 브랜치가 master인 경우 -git checkout main // 기본 브랜치가 main인 경우 -git checkout -b 브랜치이름 -ex) git checkout -b apply-feedback -``` +### 모델링 + +- 선 길이 계산기 + - 행위 + - 식을 입력 받아 좌표 그래프에 그리고 직선상의 거리를 계산한다. +- 좌표 + - 상태 + - x값과 y값을 가진다. + - 좌표는 0이상 24이하의 자연수이다. + - 행위 + - 좌표를 입력받으면 직선상의 거리를 계산한다. +- 좌표 그래프 + - 행위 + - 좌표 두 개를 입력 받아 표를 그린다. + - 표를 그린다. + - 표에 점을 찍는다. + - 표를 출력한다. + + +### 추가된 요구사항 + +- 좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. +- 좌표값을 네 개 입력한 경우, 네 점을 연결하는 사각형으로 가정한다. +- 네 점이 뒤틀어진 사다리꼴이나 마름모는 제외하고 직사각형만 허용하도록 검사한다. +- 사각형인 경우 사각형의 넓이를 계산해서 출력한다. + +- 좌표계산기 + - 행위 + - 입력을 받습니다. + - 입력이 선 인지 직사각형인지 판단합니다. + - 답을 가져옵니다. + - 도형에게 좌표를 가져옵니다. +- 도형 + - 행위 + - 답을 출력합니다. + - 좌표를 출력합니다. +- 선 + - 상태 + - 좌표 두 개를 가지고 있습니다. + - 행위 + - 답을 출력합니다. + - 답은 길이입니다. + - 좌표를 출력합니다. +- 직사각형 + - 상태 + - 좌표 네 개를 가지고 있습니다. + - 네 점이 뒤틀어진 사다리꼴이나 마름모가 아닌 직사각형만 됩니다. + - 행위 + - 답을 출력합니다. + - 넓이를 계산합니다. + - 좌표를 출력합니다. +- 좌표 그래프 + - 행위 + - 좌표 두 개를 입력 받아 표를 그립니다. + - 표를 그립니다. + - 표에 점을 찍습니다. + - 표를 출력합니다. +- 좌표 + - 상태 + - x값과 y값을 가집니다. + - 좌표는 0이상 24이하의 자연수입니다. + - 행위 + - 좌표를 입력받습니다. + - 입력되는 식은 정규 표현식에 맞아야 합니다. + - 입력되는 좌표는 숫자가 들어가야 합니다. + + +### 추가된 요구사항 + +- 좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. +- 좌표값을 세 개 입력한 경우, 세 점을 연결하는 삼각형으로 가정한다. +- 삼각형인 경우 삼각형의 넓이를 계산해서 출력한다. + +삼각형 +- 상태 + - 좌표 세 개를 가지고 있습니다. +- 행위 + - 답을 출력합니다. + - 답은 넓이입니다. + - 헤론의 공식을 통해 넓이를 구합니다. + - 좌표를 출력합니다. diff --git a/src/main/java/coordinate/CoordinateMain.java b/src/main/java/coordinate/CoordinateMain.java new file mode 100644 index 00000000..08b78e6d --- /dev/null +++ b/src/main/java/coordinate/CoordinateMain.java @@ -0,0 +1,34 @@ +package coordinate; + +import coordinate.domain.Coordinate; +import coordinate.domain.CoordinateGraphClient; +import coordinate.domain.CoordinateInputClient; +import coordinate.domain.CoordinatesCalculator; + +import java.util.List; + +public class CoordinateMain { + + public static void main(String[] args) { + coordinate.domain.CoordinateInputClient coordinateInputClient = new CoordinateInputClient() { + @Override + public String inputString() { + return "(10,10)-(14,15)"; + } + }; + coordinate.domain.CoordinateGraphClient coordinateGraphClient = new CoordinateGraphClient() { + @Override + public boolean displayGraph(List coordinates) { + return true; + } + }; + + CoordinatesCalculator calculator = new CoordinatesCalculator(coordinateInputClient.inputString()); + + // display + coordinateGraphClient.displayGraph(calculator.findCoordinates()); + + // print result + System.out.println("답은 " + calculator.getResult() + "입니다."); + } +} diff --git a/src/main/java/coordinate/domain/Coordinate.java b/src/main/java/coordinate/domain/Coordinate.java new file mode 100644 index 00000000..be9cf74a --- /dev/null +++ b/src/main/java/coordinate/domain/Coordinate.java @@ -0,0 +1,60 @@ +package coordinate.domain; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Coordinate { + private final double x; + private final double y; + + private static final String X = "x"; + private static final String Y = "y"; + + private final static Pattern PATTERN = Pattern + .compile("\\((?<" + X + ">\\d+),(?<" + Y + ">\\d+)\\)"); + + + public Coordinate(String expression) { + Matcher matcher = PATTERN.matcher(expression); + if (!matcher.matches()) { + throw new IllegalArgumentException(); + } + + String stringX = matcher.group(X); + String stringY = matcher.group(Y); + + isNumber(stringX); + isNumber(stringY); + + if (validationNumber(stringX)) { + throw new IllegalArgumentException(); + } + if (validationNumber(stringY)) { + throw new IllegalArgumentException(); + } + + x = Double.parseDouble(stringX); + y = Double.parseDouble(stringY); + + } + + private boolean validationNumber(String number) { + return 1.0 > Double.parseDouble(number) || Double.parseDouble(number) > 24.0; + } + + private void isNumber(String stringX) { + try { + Double.parseDouble(stringX); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(); + } + } + + public double getX() { + return x; + } + + public double getY() { + return y; + } +} diff --git a/src/main/java/coordinate/domain/CoordinateGraphClient.java b/src/main/java/coordinate/domain/CoordinateGraphClient.java new file mode 100644 index 00000000..ee279923 --- /dev/null +++ b/src/main/java/coordinate/domain/CoordinateGraphClient.java @@ -0,0 +1,7 @@ +package coordinate.domain; + +import java.util.List; + +public interface CoordinateGraphClient { + boolean displayGraph(List coordinates); +} diff --git a/src/main/java/coordinate/domain/CoordinateInputClient.java b/src/main/java/coordinate/domain/CoordinateInputClient.java new file mode 100644 index 00000000..862ad363 --- /dev/null +++ b/src/main/java/coordinate/domain/CoordinateInputClient.java @@ -0,0 +1,5 @@ +package coordinate.domain; + +public interface CoordinateInputClient { + String inputString(); +} diff --git a/src/main/java/coordinate/domain/CoordinatesCalculator.java b/src/main/java/coordinate/domain/CoordinatesCalculator.java new file mode 100644 index 00000000..3283a887 --- /dev/null +++ b/src/main/java/coordinate/domain/CoordinatesCalculator.java @@ -0,0 +1,39 @@ +package coordinate.domain; + +import java.util.List; + +public class CoordinatesCalculator { + private static final String REGEX = "-"; + private final Shapes shapes; + + public CoordinatesCalculator(String expression) { + if (expression.split(REGEX).length == 2) { + shapes = new Line(expression); + return; + } + + if (expression.split(REGEX).length == 3) { + shapes = new Triangle(expression); + return; + } + + if (expression.split(REGEX).length == 4) { + shapes = new Rectangle(expression); + return; + } + + throw new IllegalArgumentException(); + } + + public Shapes getShapes() { + return shapes; + } + + public Double getResult() { + return shapes.getResult(); + } + + public List findCoordinates() { + return shapes.findCoordinates(); + } +} diff --git a/src/main/java/coordinate/domain/Line.java b/src/main/java/coordinate/domain/Line.java new file mode 100644 index 00000000..33cdb5bc --- /dev/null +++ b/src/main/java/coordinate/domain/Line.java @@ -0,0 +1,46 @@ +package coordinate.domain; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static java.lang.Math.abs; + +public class Line implements Shapes { + public static final String REGEX = "-"; + private final List coordinates; + + public Line(String expression) { + + if (!expression.contains(REGEX)) { + throw new IllegalArgumentException("식이 틀렸습니다."); + } + + if (expression.split(REGEX).length != 2) { + throw new IllegalArgumentException("좌표는 두개 만 들어가야 합니다."); + } + + List coordinateList = Arrays.asList( + new Coordinate(expression.split(REGEX)[0]), + new Coordinate(expression.split(REGEX)[1]) + ); + + this.coordinates = coordinateList; + } + + @Override + public double getResult() { + return getDistance(coordinates.get(0), coordinates.get(1)); + } + + @Override + public List findCoordinates() { + return new ArrayList<>(coordinates); + } + + private double getDistance(Coordinate coordinate, Coordinate otherCoordinate) { + return Math.sqrt( + abs((coordinate.getX() - otherCoordinate.getX()) * (coordinate.getX() - otherCoordinate.getX()) + + (coordinate.getY() - otherCoordinate.getY()) * (coordinate.getY() - otherCoordinate.getY()))); + } +} diff --git a/src/main/java/coordinate/domain/Rectangle.java b/src/main/java/coordinate/domain/Rectangle.java new file mode 100644 index 00000000..26137ad0 --- /dev/null +++ b/src/main/java/coordinate/domain/Rectangle.java @@ -0,0 +1,72 @@ +package coordinate.domain; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static java.lang.Math.abs; + +public class Rectangle implements Shapes { + public static final String REGEX = "-"; + private final List coordinates; + + public Rectangle(String expression) { + + if (!expression.contains(REGEX)) { + throw new IllegalArgumentException("식이 틀렸습니다."); + } + + if (expression.split(REGEX).length != 4) { + throw new IllegalArgumentException("좌표는 네 개 만 들어가야 합니다."); + } + + List coordinateList = Arrays.asList( + new Coordinate(expression.split(REGEX)[0]), + new Coordinate(expression.split(REGEX)[1]), + new Coordinate(expression.split(REGEX)[2]), + new Coordinate(expression.split(REGEX)[3]) + ); + + List distanceList = Arrays.asList( + getDistance(coordinateList.get(0), coordinateList.get(1)), + getDistance(coordinateList.get(1), coordinateList.get(2)), + getDistance(coordinateList.get(2), coordinateList.get(3)), + getDistance(coordinateList.get(3), coordinateList.get(0)) + ); + + if (distanceList.stream().distinct().count() != 2) { + throw new IllegalArgumentException(); + } + + this.coordinates = coordinateList; + } + + @Override + public double getResult() { + return getArea(coordinates); + } + + private double getArea(List coordinates) { + List distanceList = Arrays.asList( + getDistance(coordinates.get(0), coordinates.get(1)), + getDistance(coordinates.get(1), coordinates.get(2)), + getDistance(coordinates.get(2), coordinates.get(3)), + getDistance(coordinates.get(3), coordinates.get(0)) + ); + return distanceList.stream().distinct() + .reduce((double1, double2) -> double1 * double2) + .orElseThrow(IllegalArgumentException::new); + } + + @Override + public List findCoordinates() { + return new ArrayList<>(coordinates); + } + + private double getDistance(Coordinate coordinate, Coordinate otherCoordinate) { + return Math.sqrt( + abs((coordinate.getX() - otherCoordinate.getX()) * (coordinate.getX() - otherCoordinate.getX()) + + (coordinate.getY() - otherCoordinate.getY()) * (coordinate.getY() - otherCoordinate.getY()))); + } + +} diff --git a/src/main/java/coordinate/domain/Shapes.java b/src/main/java/coordinate/domain/Shapes.java new file mode 100644 index 00000000..c069b91a --- /dev/null +++ b/src/main/java/coordinate/domain/Shapes.java @@ -0,0 +1,9 @@ +package coordinate.domain; + +import java.util.List; + +public interface Shapes { + double getResult(); + + List findCoordinates(); +} diff --git a/src/main/java/coordinate/domain/Triangle.java b/src/main/java/coordinate/domain/Triangle.java new file mode 100644 index 00000000..f53f5993 --- /dev/null +++ b/src/main/java/coordinate/domain/Triangle.java @@ -0,0 +1,57 @@ +package coordinate.domain; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static java.lang.Math.abs; +import static java.lang.Math.sqrt; + +public class Triangle implements Shapes { + public static final String REGEX = "-"; + private final List coordinates; + + + public Triangle(String expression) { + + if (!expression.contains(REGEX)) { + throw new IllegalArgumentException("식이 틀렸습니다."); + } + + if (expression.split(REGEX).length != 3) { + throw new IllegalArgumentException("좌표는 세 개만 들어가야 합니다."); + } + + List coordinateList = Arrays.asList( + new Coordinate(expression.split(REGEX)[0]), + new Coordinate(expression.split(REGEX)[1]), + new Coordinate(expression.split(REGEX)[2]) + ); + + this.coordinates = coordinateList; + } + + @Override + public double getResult() { + return getArea(this.coordinates); + } + + private double getArea(List coordinates) { + double a = getDistance(coordinates.get(0), coordinates.get(1)); + double b = getDistance(coordinates.get(1), coordinates.get(2)); + double c = getDistance(coordinates.get(2), coordinates.get(0)); + double s = (a + b + c) / 2; + return sqrt(s * (s - a) * (s - b) * (s - c)); + } + + @Override + public List findCoordinates() { + return new ArrayList<>(this.coordinates); + } + + private double getDistance(Coordinate coordinate, Coordinate otherCoordinate) { + return sqrt( + abs((coordinate.getX() - otherCoordinate.getX()) * (coordinate.getX() - otherCoordinate.getX()) + + (coordinate.getY() - otherCoordinate.getY()) * (coordinate.getY() - otherCoordinate.getY()))); + } +} diff --git a/src/main/java/rentcompany/Car.java b/src/main/java/rentcompany/Car.java index debe3229..03b2a319 100644 --- a/src/main/java/rentcompany/Car.java +++ b/src/main/java/rentcompany/Car.java @@ -1,6 +1,6 @@ package rentcompany; -public abstract class Car implements Vehicle{ +public abstract class Car implements Vehicle { /** * 리터당 이동 거리. 즉, 연비 @@ -26,6 +26,6 @@ public abstract class Car implements Vehicle{ @Override public String report() { - return getName() + " : " + (int)getChargeQuantity() + "리터"; + return getName() + " : " + (int) getChargeQuantity() + "리터"; } } diff --git a/src/test/java/coordinate/domain/CoordinateTest.java b/src/test/java/coordinate/domain/CoordinateTest.java new file mode 100644 index 00000000..6ea41900 --- /dev/null +++ b/src/test/java/coordinate/domain/CoordinateTest.java @@ -0,0 +1,57 @@ +package coordinate.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +class CoordinateTest { + + @Test + @DisplayName("좌표를 입력받아 좌표를 생성합니다.") + void test() { + String 좌표 = "(10,10)"; + assertDoesNotThrow( + () -> new Coordinate(좌표) + ); + } + + @Test + @DisplayName("입력되는 식은 정규 표현식에 맞지 않으면 IllegalArgumentException 예외가 발생합니다.") + void test1() { + String 좌표 = "(1010)"; + assertThatThrownBy( + () -> new Coordinate(좌표) + ).isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("식 내의 좌표에 숫자가 들어가지 않으면 IllegalArgumentException 예외가 발생합니다.") + void test2() { + String 좌표 = "(10,string)"; + assertThatThrownBy( + () -> new Coordinate(좌표) + ).isInstanceOf(IllegalArgumentException.class); + } + + @ParameterizedTest + @DisplayName("0 미만의 숫자가 들어가면 예외가 발생합니다.") + @ValueSource(strings = {"(-1,-5)", "(5,-1)"}) + void test3(String 좌표) { + assertThatThrownBy( + () -> new Coordinate(좌표) + ).isInstanceOf(IllegalArgumentException.class); + } + + @ParameterizedTest + @DisplayName("24 이상의 숫자가 들어가면 예외가 발생합니다.") + @ValueSource(strings = {"(5,25)", "(25,3)"}) + void test4(String 좌표) { + assertThatThrownBy( + () -> new Coordinate(좌표) + ).isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/coordinate/domain/CoordinatesCalculatorTest.java b/src/test/java/coordinate/domain/CoordinatesCalculatorTest.java new file mode 100644 index 00000000..41641a5d --- /dev/null +++ b/src/test/java/coordinate/domain/CoordinatesCalculatorTest.java @@ -0,0 +1,78 @@ +package coordinate.domain; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.offset; + +class CoordinatesCalculatorTest { + + @ParameterizedTest + @ValueSource(strings = {"(10,10)-(14,15)", "(10,10)-(22,10)-(22,18)-(10,18)", "(10,10)-(14,15)-(20,8)"}) + @DisplayName("입력을 받습니다.") + void test1(String 식) { + Assertions.assertDoesNotThrow( + () -> new CoordinatesCalculator(식) + ); + } + + @ParameterizedTest + @ValueSource(strings = {"(10,10)-(14,15)", "(10,10)-(22,10)-(22,18)-(10,18)", "(10,10)-(14,15)-(20,8)"}) + @DisplayName("입력이 선 인지 직사각형인지 판단합니다.") + void test2(String 식) { + CoordinatesCalculator calculator = new CoordinatesCalculator(식); + + if (식.equals("(10,10)-(14,15)")) { + assertThat(calculator.getShapes()).isInstanceOf(Line.class); + } + + if (식.equals("(10,10)-(22,10)-(22,18)-(10,18)")) { + assertThat(calculator.getShapes()).isInstanceOf(Rectangle.class); + } + + if (식.equals("(10,10)-(14,15)-(20,8)")) { + assertThat(calculator.getShapes()).isInstanceOf(Triangle.class); + } + } + + @ParameterizedTest + @ValueSource(strings = {"(10,10)-(10,15)", "(10,10)-(22,10)-(22,18)-(10,18)", "(10,10)-(14,15)-(20,8)"}) + @DisplayName("답을 출력합니다.") + void test3(String 식) { + CoordinatesCalculator calculator = new CoordinatesCalculator(식); + + if (식.equals("(10,10)-(10,15)")) { + assertThat(calculator.getResult()).isEqualTo(5.0); + } + + if (식.equals("(10,10)-(22,10)-(22,18)-(10,18)")) { + assertThat(calculator.getResult()).isEqualTo(96.0); + } + + if (식.equals("(10,10)-(14,15)-(20,8)")) { + assertThat(calculator.getResult()).isEqualTo(29.0, offset(0.0009)); + } + } + + @ParameterizedTest + @ValueSource(strings = {"(10,10)-(10,15)", "(10,10)-(22,10)-(22,18)-(10,18)", "(10,10)-(14,15)-(20,8)"}) + @DisplayName("좌표를 출력합니다.") + void test4(String 식) { + CoordinatesCalculator calculator = new CoordinatesCalculator(식); + + if (식.equals("(10,10)-(14,15)")) { + assertThat(calculator.findCoordinates()).hasSize(2); + } + + if (식.equals("(10,10)-(22,10)-(22,18)-(10,18)")) { + assertThat(calculator.findCoordinates()).hasSize(4); + } + + if (식.equals("(10,10)-(14,15)-(20,8)")) { + assertThat(calculator.findCoordinates()).hasSize(3); + } + } +} diff --git a/src/test/java/coordinate/domain/LineTest.java b/src/test/java/coordinate/domain/LineTest.java new file mode 100644 index 00000000..92dafb49 --- /dev/null +++ b/src/test/java/coordinate/domain/LineTest.java @@ -0,0 +1,62 @@ +package coordinate.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class LineTest { + + @Test + @DisplayName("좌표 두 개를 가지고 있습니다.") + void test1() { + // given + String 좌표_두개 = "(10,10)-(14,15)"; + Line 선 = new Line(좌표_두개); + + // when & then + assertThat(선.findCoordinates()).hasSize(2); + } + + @Test + @DisplayName("답을 출력합니다.") + void test2() { + // given + String 좌표_두개 = "(10,10)-(14,15)"; + Line 선 = new Line(좌표_두개); + + // when & then + assertThat(선.getResult()).isExactlyInstanceOf(Double.class); + } + + @Test + @DisplayName("답은 길이입니다.") + void test3() { + // given + String 좌표_두개 = "(10,10)-(10,15)"; + double 길이 = 5.0; + Line 선 = new Line(좌표_두개); + + // when & then + assertThat(선.getResult()).isEqualTo(길이); + } + + @Test + @DisplayName("- 로 나눠지는 좌표가 없으면 예외가 발생합니다.") + void test4() { + String 이상한_식 = "(10,10)(14,15)"; + assertThatThrownBy( + () -> new Line(이상한_식) + ).isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("- 로 나눠지는 좌표가 세개 이상이면 예외가 발생합니다.") + void test5() { + String 이상한_식 = "(10,10)-(14,15)-(13,15)"; + assertThatThrownBy( + () -> new Line(이상한_식) + ).isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/coordinate/domain/RectangleTest.java b/src/test/java/coordinate/domain/RectangleTest.java new file mode 100644 index 00000000..d36d239d --- /dev/null +++ b/src/test/java/coordinate/domain/RectangleTest.java @@ -0,0 +1,57 @@ +package coordinate.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +class RectangleTest { + + @Test + @DisplayName("좌표 네 개를 가지고 있습니다.") + void test1() { + // given + String 식 = "(10,10)-(22,10)-(22,18)-(10,18)"; + + // when & then + assertDoesNotThrow( + () -> new Rectangle(식) + ); + } + + @ParameterizedTest + @ValueSource(strings = {"(10,10)-(22,10)-(22,18)-(10,1)", "(10,10)-(22,10)-(22,18)-(1,18)"}) + @DisplayName("네 점이 뒤틀어진 사다리꼴이나 마름모가 입력이 되면 IllegalArgumentException 예외가 발생합니다.") + void test2(String 식) { + // when & then + assertThatThrownBy( + () -> new Rectangle(식) + ).isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("넓이를 계산합니다.") + void test5() { + // given + String 식 = "(10,10)-(22,10)-(22,18)-(10,18)"; + Rectangle 직사각형 = new Rectangle(식); + double 넓이 = 직사각형.getResult(); + + // when & then + assertThat(넓이).isEqualTo(96.0); + } + + @Test + @DisplayName("좌표를 출력합니다.") + void test6() { + // given + String 식 = "(10,10)-(22,10)-(22,18)-(10,18)"; + Rectangle 직사각형 = new Rectangle(식); + + assertThat(직사각형.findCoordinates()).hasSize(4); + } +} diff --git a/src/test/java/coordinate/domain/TriangleTest.java b/src/test/java/coordinate/domain/TriangleTest.java new file mode 100644 index 00000000..335b86dd --- /dev/null +++ b/src/test/java/coordinate/domain/TriangleTest.java @@ -0,0 +1,56 @@ +package coordinate.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +class TriangleTest { + + @Test + @DisplayName("삼각형을 그릴 수 있습니다.") + void test() { + String 식 = "(10,10)-(14,15)-(20,8)"; + assertDoesNotThrow( + () -> new Triangle(식) + ); + } + + @Test + @DisplayName("식이 틀리면 예외가 발생합니다.") + void test1() { + String 식 = "(10,10)(14,15)-(20,8)"; + assertThatThrownBy( + () -> new Triangle(식) + ).isInstanceOf(IllegalArgumentException.class); + } + + + @ParameterizedTest + @ValueSource(strings = {"(14,15)-(20,8)", "(14,15)-(20,8)-(20,15)-(14,8)"}) + @DisplayName("좌표가 세개 이외의 값이 들어오면 예외가 발생합니다.") + void test2(String 식) { + assertThatThrownBy( + () -> new Triangle(식) + ).isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("답인 삼각형의 넓이를 출력합니다.") + void test3() { + String 식 = "(10,10)-(14,15)-(20,8)"; + Triangle 삼각형 = new Triangle(식); + assertThat(삼각형.getResult()).isEqualTo(29.0, offset(0.00099)); + } + + @Test + @DisplayName("좌표를 그리기 위해 좌표들을 출력합니다.") + void test4() { + String 식 = "(10,10)-(14,15)-(20,8)"; + Triangle 삼각형 = new Triangle(식); + assertThat(삼각형.findCoordinates()).hasSize(3); + } +}