From cf1b0394823343a5836c0f2027b7ab4245e5eff6 Mon Sep 17 00:00:00 2001 From: ywm-sbbaek Date: Mon, 13 Nov 2023 16:51:30 +0900 Subject: [PATCH 01/15] =?UTF-8?q?Test:=20Calculator,=20Line=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/coordinate/CalculatorTest.java | 74 ++++++++++++++++++++ src/test/java/coordinate/LineTest.java | 39 +++++++++++ src/test/java/coordinate/PointConverter.java | 25 +++++++ 3 files changed, 138 insertions(+) create mode 100644 src/test/java/coordinate/CalculatorTest.java create mode 100644 src/test/java/coordinate/LineTest.java create mode 100644 src/test/java/coordinate/PointConverter.java diff --git a/src/test/java/coordinate/CalculatorTest.java b/src/test/java/coordinate/CalculatorTest.java new file mode 100644 index 00000000..d42d321a --- /dev/null +++ b/src/test/java/coordinate/CalculatorTest.java @@ -0,0 +1,74 @@ +package coordinate; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static coordinate.PointConverter.getPoints; +import static org.assertj.core.api.Assertions.assertThat; + +public class CalculatorTest { + + private Calculator calculator; + + @BeforeEach + void beforeEach() { + this.calculator = new Calculator(); + } + + @ParameterizedTest + @CsvSource(value = {"[24,10]:[10,24]", "[1,5]:[5,1]"}, delimiter = ':') + void 좌표_입력_테스트_범위값(String xStr, String yStr) { + // given + Point[] points = getPoints(xStr, yStr); + + // when + boolean result = calculator.validatePoints(points); + + // then + assertThat(result).isTrue(); + } + + @ParameterizedTest + @CsvSource(value = {"[25,10]:[10,25]", "[0,23]:[13,0]", "[-1,8]:[17,-1]"}, delimiter = ':') + void 좌표_입력_테스트_범위_초과(String xStr, String yStr) { + // given + Point[] points = getPoints(xStr, yStr); + + // when + boolean result = calculator.validatePoints(points); + + // then + assertThat(result).isFalse(); + } + + @ParameterizedTest + @CsvSource(value = {"(10,10)-(14,15):[10,14]:[10,15]"}, delimiter = ':') + void 좌표_입력_테스트(String input, String xStr, String yStr) { + // given + Point[] points = getPoints(xStr, yStr); + + + // when + Point[] result = calculator.toPoints(input); + + + // then + assertThat(result).contains(points); + } + + @Test + void 좌표_두개_입력() { + // given + Point[] points = new Point[2]; + points[0] = new Point(10, 10); + points[1] = new Point(14, 15); + + // when + Shape result = calculator.getShape(points); + + // then + assertThat(result.getClass()).isEqualTo(Line.class); + } +} \ No newline at end of file diff --git a/src/test/java/coordinate/LineTest.java b/src/test/java/coordinate/LineTest.java new file mode 100644 index 00000000..43b2d66a --- /dev/null +++ b/src/test/java/coordinate/LineTest.java @@ -0,0 +1,39 @@ +package coordinate; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static coordinate.PointConverter.getPoints; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.offset; + +class LineTest { + + @ParameterizedTest + @CsvSource(value = {"[10,14]:[14,15]"}, delimiter = ':') + void 두_점_저장(String xStr, String yStr) { + // given + Point[] points = getPoints(xStr, yStr); + Line line = new Line(points[0], points[1]); + + // when + Point[] result = line.getEndPoints(); + + // then + assertThat(result).contains(points); + } + + @ParameterizedTest + @CsvSource(value = {"[10,14]:[14,15]"}, delimiter = ':') + void 거리_계산(String xStr, String yStr) { + // given + Point[] points = getPoints(xStr, yStr); + Line line = new Line(points[0], points[1]); + + // when + double result = line.calculate(); + + // then + assertThat(result).isEqualTo(6.403, offset(0.009)); + } +} \ No newline at end of file diff --git a/src/test/java/coordinate/PointConverter.java b/src/test/java/coordinate/PointConverter.java new file mode 100644 index 00000000..3cb354ea --- /dev/null +++ b/src/test/java/coordinate/PointConverter.java @@ -0,0 +1,25 @@ +package coordinate; + +import java.util.Arrays; + +public class PointConverter { + + public static Point[] getPoints(String xStr, String yStr) { + int[] x = getArray(xStr); + int[] y = getArray(yStr); + + Point[] points = new Point[x.length]; + for (int i = 0; i < x.length; i++) { + Point point = new Point(x[i], y[i]); + points[i] = point; + } + + return points; + } + + public static int[] getArray(String s) { + return Arrays.stream(s.replace("[", "").replace("]", "").split(",")) + .mapToInt(c -> Integer.parseInt(c.trim())) + .toArray(); + } +} From 1732d7a39dfb705f408b739a515fd2baa837a77e Mon Sep 17 00:00:00 2001 From: ywm-sbbaek Date: Mon, 13 Nov 2023 17:21:55 +0900 Subject: [PATCH 02/15] =?UTF-8?q?Test:=20Calculator,=20Point,=20Line=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/Calculator.java | 41 +++++++++++++++++++ .../java/coordinate/GeometricElement.java | 5 +++ src/main/java/coordinate/Line.java | 25 +++++++++++ src/main/java/coordinate/Point.java | 37 +++++++++++++++++ src/test/java/coordinate/CalculatorTest.java | 4 +- src/test/java/coordinate/LineTest.java | 6 +-- 6 files changed, 113 insertions(+), 5 deletions(-) create mode 100644 src/main/java/coordinate/Calculator.java create mode 100644 src/main/java/coordinate/GeometricElement.java create mode 100644 src/main/java/coordinate/Line.java create mode 100644 src/main/java/coordinate/Point.java diff --git a/src/main/java/coordinate/Calculator.java b/src/main/java/coordinate/Calculator.java new file mode 100644 index 00000000..35eb52e6 --- /dev/null +++ b/src/main/java/coordinate/Calculator.java @@ -0,0 +1,41 @@ +package coordinate; + +public class Calculator { + + public boolean validatePoints(Point[] points) { + for (Point point : points) { + if (point.getX() < 1) { + return false; + } + + if (point.getY() > 24) { + return false; + } + } + + return true; + } + + public Point[] toPoints(String input) { + String[] points = input.split("-"); + Point[] result = new Point[points.length]; + + for (int i = 0; i < points.length; i++) { + String[] coordinate = points[i].replace("(", "") + .replace(")", "") + .split(","); + + result[i] = new Point(Integer.parseInt(coordinate[0].trim()), Integer.parseInt(coordinate[1].trim())); + } + + return result; + } + + public GeometricElement getShape(Point[] points) { + if (points.length == 2) { + return new Line(points[0], points[1]); + } + + throw new ArithmeticException("No Shape"); + } +} diff --git a/src/main/java/coordinate/GeometricElement.java b/src/main/java/coordinate/GeometricElement.java new file mode 100644 index 00000000..9acf1c3a --- /dev/null +++ b/src/main/java/coordinate/GeometricElement.java @@ -0,0 +1,5 @@ +package coordinate; + +public interface GeometricElement { + double calculate(); +} diff --git a/src/main/java/coordinate/Line.java b/src/main/java/coordinate/Line.java new file mode 100644 index 00000000..2ceb0414 --- /dev/null +++ b/src/main/java/coordinate/Line.java @@ -0,0 +1,25 @@ +package coordinate; + +import java.util.Arrays; + +public class Line implements GeometricElement { + private final Point[] points; + + public Line(Point point1, Point point2) { + points = new Point[2]; + points[0] = point1; + points[1] = point2; + } + + public Point[] getEndPoints() { + return Arrays.copyOf(points, 2); + } + + @Override + public double calculate() { + int dx = points[0].getX() - points[1].getX(); + int dy = points[0].getY() - points[1].getY(); + + return Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)); + } +} diff --git a/src/main/java/coordinate/Point.java b/src/main/java/coordinate/Point.java new file mode 100644 index 00000000..9ab544fb --- /dev/null +++ b/src/main/java/coordinate/Point.java @@ -0,0 +1,37 @@ +package coordinate; + +public class Point { + private final int x; + private final int y; + + public Point(int x, int y) { + this.x = x; + this.y = y; + } + + public int getX() { + return this.x; + } + + public int getY() { + return this.y; + } + + @Override + public int hashCode() { + int result = 17; + result = 37 * result + this.x; + result = 37 * result + this.y; + return result; + } + + @Override + public boolean equals(Object obj) { + if (obj.getClass() != Point.class) { + return false; + } + + Point compare = (Point) obj; + return compare.getX() == this.x && compare.getY() == this.y; + } +} diff --git a/src/test/java/coordinate/CalculatorTest.java b/src/test/java/coordinate/CalculatorTest.java index d42d321a..f0e57a59 100644 --- a/src/test/java/coordinate/CalculatorTest.java +++ b/src/test/java/coordinate/CalculatorTest.java @@ -55,7 +55,7 @@ void beforeEach() { // then - assertThat(result).contains(points); + assertThat(result).containsExactly(points); } @Test @@ -66,7 +66,7 @@ void beforeEach() { points[1] = new Point(14, 15); // when - Shape result = calculator.getShape(points); + GeometricElement result = calculator.getShape(points); // then assertThat(result.getClass()).isEqualTo(Line.class); diff --git a/src/test/java/coordinate/LineTest.java b/src/test/java/coordinate/LineTest.java index 43b2d66a..7a62340f 100644 --- a/src/test/java/coordinate/LineTest.java +++ b/src/test/java/coordinate/LineTest.java @@ -11,7 +11,7 @@ class LineTest { @ParameterizedTest @CsvSource(value = {"[10,14]:[14,15]"}, delimiter = ':') - void 두_점_저장(String xStr, String yStr) { + void 생성(String xStr, String yStr) { // given Point[] points = getPoints(xStr, yStr); Line line = new Line(points[0], points[1]); @@ -20,11 +20,11 @@ class LineTest { Point[] result = line.getEndPoints(); // then - assertThat(result).contains(points); + assertThat(result).containsExactly(points); } @ParameterizedTest - @CsvSource(value = {"[10,14]:[14,15]"}, delimiter = ':') + @CsvSource(value = {"[10,14]:[10,15]"}, delimiter = ':') void 거리_계산(String xStr, String yStr) { // given Point[] points = getPoints(xStr, yStr); From 923e88c52dbffd144797c5780f697e1e717cd360 Mon Sep 17 00:00:00 2001 From: ywm-sbbaek Date: Mon, 13 Nov 2023 18:17:28 +0900 Subject: [PATCH 03/15] =?UTF-8?q?Test:=20Rectangle=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/Rectangle.java | 71 +++++++++++++++++++++ src/main/java/coordinate/Shape.java | 7 ++ src/test/java/coordinate/RectangleTest.java | 54 ++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 src/main/java/coordinate/Rectangle.java create mode 100644 src/main/java/coordinate/Shape.java create mode 100644 src/test/java/coordinate/RectangleTest.java diff --git a/src/main/java/coordinate/Rectangle.java b/src/main/java/coordinate/Rectangle.java new file mode 100644 index 00000000..7f0a21fd --- /dev/null +++ b/src/main/java/coordinate/Rectangle.java @@ -0,0 +1,71 @@ +package coordinate; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Rectangle implements GeometricElement, Shape { + private final Point[] vertexes; + + public Rectangle(Point point1, Point point2, Point point3, Point point4) { + vertexes = new Point[4]; + List vertexes = new ArrayList<>(); + vertexes.add(point1); + vertexes.add(point2); + vertexes.add(point3); + vertexes.add(point4); + validate(); + sort(vertexes); + } + + @Override + public boolean validate() { + return false; + } + + private void sort(List vertexes) { + Point origin = new Point(0, 0); + + Point leftDown = vertexes.get(0); + double minLength = new Line(origin, vertexes.get(0)).calculate(); + for (int i = 1; i < vertexes.size(); i++) { + double compareLength = new Line(origin, vertexes.get(i)).calculate(); + + if (minLength > compareLength) { + minLength = compareLength; + leftDown = vertexes.get(i); + } + } + + vertexes.remove(leftDown); + this.vertexes[0] = leftDown; + + Point rightUp = vertexes.get(0); + double maxLength = new Line(leftDown, vertexes.get(0)).calculate(); + for (int i = 1; i < vertexes.size(); i++) { + double compareLength = new Line(leftDown, vertexes.get(i)).calculate(); + + if (maxLength < compareLength) { + maxLength = compareLength; + rightUp = vertexes.get(i); + } + } + + vertexes.remove(rightUp); + this.vertexes[4] = rightUp; + this.vertexes[1] = vertexes.get(0); + this.vertexes[2] = vertexes.get(1); + } + + @Override + public Point[] getVertex() { + return Arrays.copyOf(vertexes, 4); + } + + @Override + public double calculate() { + int width = vertexes[0].getX() - vertexes[1].getX(); + int height = vertexes[0].getY() - vertexes[2].getY(); + return width * height; + } +} diff --git a/src/main/java/coordinate/Shape.java b/src/main/java/coordinate/Shape.java new file mode 100644 index 00000000..db724a08 --- /dev/null +++ b/src/main/java/coordinate/Shape.java @@ -0,0 +1,7 @@ +package coordinate; + +public interface Shape { + boolean validate(); + + Point[] getVertex(); +} diff --git a/src/test/java/coordinate/RectangleTest.java b/src/test/java/coordinate/RectangleTest.java new file mode 100644 index 00000000..4d6c7b4a --- /dev/null +++ b/src/test/java/coordinate/RectangleTest.java @@ -0,0 +1,54 @@ +package coordinate; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static coordinate.PointConverter.getPoints; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.offset; + +public class RectangleTest { + + @ParameterizedTest + @CsvSource(value = {"[10,22,22,10]:[10,10,18,18]"}, delimiter = ':') + void 생성_성공(String xStr, String yStr) { + // given + Point[] points = getPoints(xStr, yStr); + Rectangle rectangle = new Rectangle(points[0], points[1], points[2], points[3]); + + // when + Point[] result = rectangle.getVertex(); + + // then + Assertions.assertThat(result).containsExactly(points); + } + + @ParameterizedTest + @CsvSource(value = {"[10,22,22,10]:[10,10,18,18]"}, delimiter = ':') + void 생성_실패(String xStr, String yStr) { + // given + Point[] points = getPoints(xStr, yStr); + Rectangle rectangle = new Rectangle(points[0], points[1], points[2], points[3]); + + // when + Point[] result = rectangle.getVertex(); + + // then + Assertions.assertThat(result).containsExactly(points); + } + + @ParameterizedTest + @CsvSource(value = {"[10,14]:[10,15]"}, delimiter = ':') + void 넓이_계산(String xStr, String yStr) { + // given + Point[] points = getPoints(xStr, yStr); + Rectangle rectangle = new Rectangle(points[0], points[1], points[2], points[3]); + + // when + double result = rectangle.calculate(); + + // then + assertThat(result).isEqualTo(96, offset(0.1)); + } +} From 00bdf125c714cfcd8a58aa7f56bb5b830620156b Mon Sep 17 00:00:00 2001 From: ywm-sbbaek Date: Mon, 13 Nov 2023 18:17:28 +0900 Subject: [PATCH 04/15] =?UTF-8?q?Test:=20Rectangle=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/Rectangle.java | 96 +++++++++++++-------- src/main/java/coordinate/Shape.java | 2 +- src/test/java/coordinate/RectangleTest.java | 20 +++-- 3 files changed, 74 insertions(+), 44 deletions(-) diff --git a/src/main/java/coordinate/Rectangle.java b/src/main/java/coordinate/Rectangle.java index 7f0a21fd..23308fea 100644 --- a/src/main/java/coordinate/Rectangle.java +++ b/src/main/java/coordinate/Rectangle.java @@ -8,53 +8,81 @@ public class Rectangle implements GeometricElement, Shape { private final Point[] vertexes; public Rectangle(Point point1, Point point2, Point point3, Point point4) { - vertexes = new Point[4]; - List vertexes = new ArrayList<>(); - vertexes.add(point1); - vertexes.add(point2); - vertexes.add(point3); - vertexes.add(point4); + List points = new ArrayList<>(); + points.add(point1); + points.add(point2); + points.add(point3); + points.add(point4); + + this.vertexes = getSortedVertexes(points); validate(); - sort(vertexes); } @Override - public boolean validate() { - return false; - } + public void validate() { + boolean result1; + boolean result2; - private void sort(List vertexes) { - Point origin = new Point(0, 0); + result1 = isRightAngle(new Line(vertexes[0], vertexes[2]), new Line(vertexes[0], vertexes[3])); + result2 = isRightAngle(new Line(vertexes[1], vertexes[2]), new Line(vertexes[1], vertexes[3])); - Point leftDown = vertexes.get(0); - double minLength = new Line(origin, vertexes.get(0)).calculate(); - for (int i = 1; i < vertexes.size(); i++) { - double compareLength = new Line(origin, vertexes.get(i)).calculate(); - - if (minLength > compareLength) { - minLength = compareLength; - leftDown = vertexes.get(i); - } + if (!(result1 && result2)) { + throw new ArithmeticException("No Rectangle."); } + } + + /** + * 네 점을 다음과 같이 대칭 점끼리 묶어서 정렬 + * 1. 한 점을 고른다 + * 2. 다른 세 점 중 앞서 정한 한 점과 가장 멀리 있는 한점을 찾는다 (고른 점과 대칭점) + * 3. 위의 두 점을 순서 대로 배열에 저장 + * 4. 나머지 두 점을 이어서 배열에 저장 (나머지 두점은 또 서로의 대칭점) + * @param points 입력 받은 점들 + * @return 정렬된 점(꼭지점)들 + */ + private Point[] getSortedVertexes(List points) { + Point[] sortedVertexes = new Point[4]; - vertexes.remove(leftDown); - this.vertexes[0] = leftDown; + Point base = points.get(0); + points.remove(base); + sortedVertexes[0] = base; - Point rightUp = vertexes.get(0); - double maxLength = new Line(leftDown, vertexes.get(0)).calculate(); - for (int i = 1; i < vertexes.size(); i++) { - double compareLength = new Line(leftDown, vertexes.get(i)).calculate(); + Point opposite = points.get(0); + double maxLength = new Line(base, opposite).calculate(); + for (int i = 1; i < points.size(); i++) { + double compareLength = new Line(base, points.get(i)).calculate(); if (maxLength < compareLength) { maxLength = compareLength; - rightUp = vertexes.get(i); + opposite = points.get(i); } } - vertexes.remove(rightUp); - this.vertexes[4] = rightUp; - this.vertexes[1] = vertexes.get(0); - this.vertexes[2] = vertexes.get(1); + points.remove(opposite); + sortedVertexes[1] = opposite; + sortedVertexes[2] = points.get(0); + sortedVertexes[3] = points.get(1); + + return sortedVertexes; + } + + private boolean isRightAngle(Line line1, Line line2) { + Point[] p1 = line1.getEndPoints(); + double angle1 = getAngle(p1[0], p1[1]); + + Point[] p2 = line2.getEndPoints(); + double angle2 = getAngle(p2[0], p2[1]); + + double betweenAngle = Math.abs(angle1 - angle2); + return betweenAngle == 90; + } + + private double getAngle(Point start, Point end) { + double dx = start.getX() - end.getX(); + double dy = start.getY() - end.getY(); + + double angle = Math.atan2(dy, dx) * (180.0 / Math.PI); + return Math.abs(angle); } @Override @@ -64,8 +92,8 @@ public Point[] getVertex() { @Override public double calculate() { - int width = vertexes[0].getX() - vertexes[1].getX(); - int height = vertexes[0].getY() - vertexes[2].getY(); + int width = vertexes[0].getX() - vertexes[2].getX(); + int height = vertexes[0].getY() - vertexes[3].getY(); return width * height; } } diff --git a/src/main/java/coordinate/Shape.java b/src/main/java/coordinate/Shape.java index db724a08..5337b3ff 100644 --- a/src/main/java/coordinate/Shape.java +++ b/src/main/java/coordinate/Shape.java @@ -1,7 +1,7 @@ package coordinate; public interface Shape { - boolean validate(); + void validate(); Point[] getVertex(); } diff --git a/src/test/java/coordinate/RectangleTest.java b/src/test/java/coordinate/RectangleTest.java index 4d6c7b4a..0db50be1 100644 --- a/src/test/java/coordinate/RectangleTest.java +++ b/src/test/java/coordinate/RectangleTest.java @@ -1,12 +1,14 @@ package coordinate; -import org.assertj.core.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; +import java.io.IOException; + import static coordinate.PointConverter.getPoints; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.offset; +import static org.junit.jupiter.api.Assertions.assertThrows; public class RectangleTest { @@ -15,31 +17,31 @@ public class RectangleTest { void 생성_성공(String xStr, String yStr) { // given Point[] points = getPoints(xStr, yStr); - Rectangle rectangle = new Rectangle(points[0], points[1], points[2], points[3]); // when + Rectangle rectangle = new Rectangle(points[0], points[1], points[2], points[3]); Point[] result = rectangle.getVertex(); // then - Assertions.assertThat(result).containsExactly(points); + assertThat(result).contains(points); } @ParameterizedTest - @CsvSource(value = {"[10,22,22,10]:[10,10,18,18]"}, delimiter = ':') + @CsvSource(value = {"[10,22,22,10]:[10,10,19,18]"}, delimiter = ':') void 생성_실패(String xStr, String yStr) { // given Point[] points = getPoints(xStr, yStr); - Rectangle rectangle = new Rectangle(points[0], points[1], points[2], points[3]); // when - Point[] result = rectangle.getVertex(); - // then - Assertions.assertThat(result).containsExactly(points); + ArithmeticException result = assertThrows(ArithmeticException.class, + () -> new Rectangle(points[0], points[1], points[2], points[3])); + + assertThat(result.getMessage()).contains("No Rectangle"); } @ParameterizedTest - @CsvSource(value = {"[10,14]:[10,15]"}, delimiter = ':') + @CsvSource(value = {"[10,22,22,10]:[10,10,18,18]"}, delimiter = ':') void 넓이_계산(String xStr, String yStr) { // given Point[] points = getPoints(xStr, yStr); From d9870459b3dbe0f8f64671d26549844c44d57c9e Mon Sep 17 00:00:00 2001 From: ywm-sbbaek Date: Mon, 13 Nov 2023 18:17:28 +0900 Subject: [PATCH 05/15] =?UTF-8?q?Test:=20Rectangle=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=9D=98=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/Rectangle.java | 96 +++++++++++++-------- src/main/java/coordinate/Shape.java | 2 +- src/test/java/coordinate/RectangleTest.java | 20 +++-- 3 files changed, 74 insertions(+), 44 deletions(-) diff --git a/src/main/java/coordinate/Rectangle.java b/src/main/java/coordinate/Rectangle.java index 7f0a21fd..23308fea 100644 --- a/src/main/java/coordinate/Rectangle.java +++ b/src/main/java/coordinate/Rectangle.java @@ -8,53 +8,81 @@ public class Rectangle implements GeometricElement, Shape { private final Point[] vertexes; public Rectangle(Point point1, Point point2, Point point3, Point point4) { - vertexes = new Point[4]; - List vertexes = new ArrayList<>(); - vertexes.add(point1); - vertexes.add(point2); - vertexes.add(point3); - vertexes.add(point4); + List points = new ArrayList<>(); + points.add(point1); + points.add(point2); + points.add(point3); + points.add(point4); + + this.vertexes = getSortedVertexes(points); validate(); - sort(vertexes); } @Override - public boolean validate() { - return false; - } + public void validate() { + boolean result1; + boolean result2; - private void sort(List vertexes) { - Point origin = new Point(0, 0); + result1 = isRightAngle(new Line(vertexes[0], vertexes[2]), new Line(vertexes[0], vertexes[3])); + result2 = isRightAngle(new Line(vertexes[1], vertexes[2]), new Line(vertexes[1], vertexes[3])); - Point leftDown = vertexes.get(0); - double minLength = new Line(origin, vertexes.get(0)).calculate(); - for (int i = 1; i < vertexes.size(); i++) { - double compareLength = new Line(origin, vertexes.get(i)).calculate(); - - if (minLength > compareLength) { - minLength = compareLength; - leftDown = vertexes.get(i); - } + if (!(result1 && result2)) { + throw new ArithmeticException("No Rectangle."); } + } + + /** + * 네 점을 다음과 같이 대칭 점끼리 묶어서 정렬 + * 1. 한 점을 고른다 + * 2. 다른 세 점 중 앞서 정한 한 점과 가장 멀리 있는 한점을 찾는다 (고른 점과 대칭점) + * 3. 위의 두 점을 순서 대로 배열에 저장 + * 4. 나머지 두 점을 이어서 배열에 저장 (나머지 두점은 또 서로의 대칭점) + * @param points 입력 받은 점들 + * @return 정렬된 점(꼭지점)들 + */ + private Point[] getSortedVertexes(List points) { + Point[] sortedVertexes = new Point[4]; - vertexes.remove(leftDown); - this.vertexes[0] = leftDown; + Point base = points.get(0); + points.remove(base); + sortedVertexes[0] = base; - Point rightUp = vertexes.get(0); - double maxLength = new Line(leftDown, vertexes.get(0)).calculate(); - for (int i = 1; i < vertexes.size(); i++) { - double compareLength = new Line(leftDown, vertexes.get(i)).calculate(); + Point opposite = points.get(0); + double maxLength = new Line(base, opposite).calculate(); + for (int i = 1; i < points.size(); i++) { + double compareLength = new Line(base, points.get(i)).calculate(); if (maxLength < compareLength) { maxLength = compareLength; - rightUp = vertexes.get(i); + opposite = points.get(i); } } - vertexes.remove(rightUp); - this.vertexes[4] = rightUp; - this.vertexes[1] = vertexes.get(0); - this.vertexes[2] = vertexes.get(1); + points.remove(opposite); + sortedVertexes[1] = opposite; + sortedVertexes[2] = points.get(0); + sortedVertexes[3] = points.get(1); + + return sortedVertexes; + } + + private boolean isRightAngle(Line line1, Line line2) { + Point[] p1 = line1.getEndPoints(); + double angle1 = getAngle(p1[0], p1[1]); + + Point[] p2 = line2.getEndPoints(); + double angle2 = getAngle(p2[0], p2[1]); + + double betweenAngle = Math.abs(angle1 - angle2); + return betweenAngle == 90; + } + + private double getAngle(Point start, Point end) { + double dx = start.getX() - end.getX(); + double dy = start.getY() - end.getY(); + + double angle = Math.atan2(dy, dx) * (180.0 / Math.PI); + return Math.abs(angle); } @Override @@ -64,8 +92,8 @@ public Point[] getVertex() { @Override public double calculate() { - int width = vertexes[0].getX() - vertexes[1].getX(); - int height = vertexes[0].getY() - vertexes[2].getY(); + int width = vertexes[0].getX() - vertexes[2].getX(); + int height = vertexes[0].getY() - vertexes[3].getY(); return width * height; } } diff --git a/src/main/java/coordinate/Shape.java b/src/main/java/coordinate/Shape.java index db724a08..5337b3ff 100644 --- a/src/main/java/coordinate/Shape.java +++ b/src/main/java/coordinate/Shape.java @@ -1,7 +1,7 @@ package coordinate; public interface Shape { - boolean validate(); + void validate(); Point[] getVertex(); } diff --git a/src/test/java/coordinate/RectangleTest.java b/src/test/java/coordinate/RectangleTest.java index 4d6c7b4a..0db50be1 100644 --- a/src/test/java/coordinate/RectangleTest.java +++ b/src/test/java/coordinate/RectangleTest.java @@ -1,12 +1,14 @@ package coordinate; -import org.assertj.core.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; +import java.io.IOException; + import static coordinate.PointConverter.getPoints; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.offset; +import static org.junit.jupiter.api.Assertions.assertThrows; public class RectangleTest { @@ -15,31 +17,31 @@ public class RectangleTest { void 생성_성공(String xStr, String yStr) { // given Point[] points = getPoints(xStr, yStr); - Rectangle rectangle = new Rectangle(points[0], points[1], points[2], points[3]); // when + Rectangle rectangle = new Rectangle(points[0], points[1], points[2], points[3]); Point[] result = rectangle.getVertex(); // then - Assertions.assertThat(result).containsExactly(points); + assertThat(result).contains(points); } @ParameterizedTest - @CsvSource(value = {"[10,22,22,10]:[10,10,18,18]"}, delimiter = ':') + @CsvSource(value = {"[10,22,22,10]:[10,10,19,18]"}, delimiter = ':') void 생성_실패(String xStr, String yStr) { // given Point[] points = getPoints(xStr, yStr); - Rectangle rectangle = new Rectangle(points[0], points[1], points[2], points[3]); // when - Point[] result = rectangle.getVertex(); - // then - Assertions.assertThat(result).containsExactly(points); + ArithmeticException result = assertThrows(ArithmeticException.class, + () -> new Rectangle(points[0], points[1], points[2], points[3])); + + assertThat(result.getMessage()).contains("No Rectangle"); } @ParameterizedTest - @CsvSource(value = {"[10,14]:[10,15]"}, delimiter = ':') + @CsvSource(value = {"[10,22,22,10]:[10,10,18,18]"}, delimiter = ':') void 넓이_계산(String xStr, String yStr) { // given Point[] points = getPoints(xStr, yStr); From c705c76c7be7511cf175f2e86e85d3c74ac21124 Mon Sep 17 00:00:00 2001 From: ywm-sbbaek Date: Tue, 14 Nov 2023 16:24:35 +0900 Subject: [PATCH 06/15] =?UTF-8?q?Test:=20Triangle=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/coordinate/TriangleTest.java | 54 ++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/test/java/coordinate/TriangleTest.java diff --git a/src/test/java/coordinate/TriangleTest.java b/src/test/java/coordinate/TriangleTest.java new file mode 100644 index 00000000..1e106a39 --- /dev/null +++ b/src/test/java/coordinate/TriangleTest.java @@ -0,0 +1,54 @@ +package coordinate; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static coordinate.PointConverter.getPoints; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.offset; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class TriangleTest { + + @ParameterizedTest + @CsvSource(value = {"[10,14,20]:[10,15,8]"}, delimiter = ':') + void 생성_성공(String xStr, String yStr) { + // given + Point[] points = getPoints(xStr, yStr); + + // when + Triangle triangle = new Triangle(points[0], points[1], points[2]); + Point[] result = triangle.getVertex(); + + // then + assertThat(result).contains(points); + } + + @ParameterizedTest + @CsvSource(value = {"[10,10,10]:[10,15,8]"}, delimiter = ':') + void 생성_실패(String xStr, String yStr) { + // given + Point[] points = getPoints(xStr, yStr); + + // when + // then + ArithmeticException result = assertThrows(ArithmeticException.class, + () -> new Triangle(points[0], points[1], points[2])); + + assertThat(result.getMessage()).contains("No Triangle"); + } + + @ParameterizedTest + @CsvSource(value = {"[10,14,20]:[10,15,8]"}, delimiter = ':') + void 넓이_계산(String xStr, String yStr) { + // given + Point[] points = getPoints(xStr, yStr); + Triangle triangle = new Triangle(points[0], points[1], points[2]); + + // when + double result = triangle.calculate(); + + // then + assertThat(result).isEqualTo(29, offset(0.1)); + } +} From 146f48386ddefe5d941d9ef02607fe4702806612 Mon Sep 17 00:00:00 2001 From: ywm-sbbaek Date: Tue, 14 Nov 2023 16:24:46 +0900 Subject: [PATCH 07/15] =?UTF-8?q?feat:=20Triangle=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/Triangle.java | 51 ++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/main/java/coordinate/Triangle.java diff --git a/src/main/java/coordinate/Triangle.java b/src/main/java/coordinate/Triangle.java new file mode 100644 index 00000000..81385da9 --- /dev/null +++ b/src/main/java/coordinate/Triangle.java @@ -0,0 +1,51 @@ +package coordinate; + +import java.util.Arrays; + +public class Triangle implements GeometricElement, Shape { + + private final Point[] vertexes; + + public Triangle(Point point1, Point point2, Point point3) { + vertexes = new Point[3]; + + vertexes[0] = point1; + vertexes[1] = point2; + vertexes[2] = point3; + + validate(); + } + + @Override + public double calculate() { + double a = new Line(vertexes[0], vertexes[1]).calculate(); + double b = new Line(vertexes[0], vertexes[2]).calculate(); + double c = new Line(vertexes[1], vertexes[2]).calculate(); + + double s = (a + b + c) / 2; + + return Math.sqrt(s * (s - a) * (s - b) * (s - c)); + } + + @Override + public void validate() { + int dx = vertexes[0].getX() - vertexes[1].getX(); + int dy = vertexes[0].getY() - vertexes[1].getY(); + + double slope1 = Math.abs((double) dy / dx); + + dx = vertexes[0].getX() - vertexes[2].getX(); + dy = vertexes[0].getY() - vertexes[2].getY(); + + double slope2 = Math.abs((double) dy / dx); + + if (slope1 == slope2) { + throw new ArithmeticException("No Triangle."); + } + } + + @Override + public Point[] getVertex() { + return Arrays.copyOf(vertexes, 3); + } +} From 9a5f07fbe1c65d3f89806464ebee8c8ac761f694 Mon Sep 17 00:00:00 2001 From: ywm-sbbaek Date: Tue, 14 Nov 2023 16:54:24 +0900 Subject: [PATCH 08/15] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 21 +++++++ src/main/java/coordinate/Calculator.java | 16 +++-- .../java/coordinate/GeometricElement.java | 2 + src/main/java/coordinate/Line.java | 8 +++ src/main/java/coordinate/Rectangle.java | 8 +++ src/main/java/coordinate/Triangle.java | 8 +++ src/main/java/util/Plate.java | 61 +++++++++++++++++++ src/main/java/util/Terminal.java | 19 ++++++ src/test/java/coordinate/CalculatorTest.java | 2 +- 9 files changed, 140 insertions(+), 5 deletions(-) create mode 100644 src/main/java/Main.java create mode 100644 src/main/java/util/Plate.java create mode 100644 src/main/java/util/Terminal.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 00000000..f6c92032 --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,21 @@ +import coordinate.Calculator; +import coordinate.GeometricElement; +import coordinate.Point; +import util.Plate; +import util.Terminal; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) throws IOException { + String in = Terminal.in("좌표를 입력하세요." + System.lineSeparator()); + Point[] points = Calculator.toPoints(in); + if (Calculator.validatePoints(points)) { + Plate plate = new Plate(); + plate.drawPoints(points); + plate.print(); + GeometricElement geometricElement = Calculator.getGeometricElement(points); + geometricElement.printCalculateResult(); + } + } +} diff --git a/src/main/java/coordinate/Calculator.java b/src/main/java/coordinate/Calculator.java index 35eb52e6..32dad593 100644 --- a/src/main/java/coordinate/Calculator.java +++ b/src/main/java/coordinate/Calculator.java @@ -2,7 +2,7 @@ public class Calculator { - public boolean validatePoints(Point[] points) { + public static boolean validatePoints(Point[] points) { for (Point point : points) { if (point.getX() < 1) { return false; @@ -16,7 +16,7 @@ public boolean validatePoints(Point[] points) { return true; } - public Point[] toPoints(String input) { + public static Point[] toPoints(String input) { String[] points = input.split("-"); Point[] result = new Point[points.length]; @@ -31,11 +31,19 @@ public Point[] toPoints(String input) { return result; } - public GeometricElement getShape(Point[] points) { + public static GeometricElement getGeometricElement(Point[] points) { if (points.length == 2) { return new Line(points[0], points[1]); } - throw new ArithmeticException("No Shape"); + if (points.length == 4) { + return new Rectangle(points[0], points[1], points[2], points[3]); + } + + if (points.length == 3) { + return new Triangle(points[0], points[1], points[2]); + } + + throw new ArithmeticException("No Line or Shape"); } } diff --git a/src/main/java/coordinate/GeometricElement.java b/src/main/java/coordinate/GeometricElement.java index 9acf1c3a..97f99772 100644 --- a/src/main/java/coordinate/GeometricElement.java +++ b/src/main/java/coordinate/GeometricElement.java @@ -2,4 +2,6 @@ public interface GeometricElement { double calculate(); + + void printCalculateResult(); } diff --git a/src/main/java/coordinate/Line.java b/src/main/java/coordinate/Line.java index 2ceb0414..f7317289 100644 --- a/src/main/java/coordinate/Line.java +++ b/src/main/java/coordinate/Line.java @@ -1,5 +1,7 @@ package coordinate; +import util.Terminal; + import java.util.Arrays; public class Line implements GeometricElement { @@ -22,4 +24,10 @@ public double calculate() { return Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)); } + + @Override + public void printCalculateResult() { + String message = String.format("두 점 사이의 거리는 %.6f", this.calculate()); + Terminal.out(message); + } } diff --git a/src/main/java/coordinate/Rectangle.java b/src/main/java/coordinate/Rectangle.java index 23308fea..d936314e 100644 --- a/src/main/java/coordinate/Rectangle.java +++ b/src/main/java/coordinate/Rectangle.java @@ -1,5 +1,7 @@ package coordinate; +import util.Terminal; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -96,4 +98,10 @@ public double calculate() { int height = vertexes[0].getY() - vertexes[3].getY(); return width * height; } + + @Override + public void printCalculateResult() { + String message = String.format("사각형 넓이는 %.0f", this.calculate()); + Terminal.out(message); + } } diff --git a/src/main/java/coordinate/Triangle.java b/src/main/java/coordinate/Triangle.java index 81385da9..8303d488 100644 --- a/src/main/java/coordinate/Triangle.java +++ b/src/main/java/coordinate/Triangle.java @@ -1,5 +1,7 @@ package coordinate; +import util.Terminal; + import java.util.Arrays; public class Triangle implements GeometricElement, Shape { @@ -27,6 +29,12 @@ public double calculate() { return Math.sqrt(s * (s - a) * (s - b) * (s - c)); } + @Override + public void printCalculateResult() { + String message = String.format("삼각형 넓이는 %.1f", this.calculate()); + Terminal.out(message); + } + @Override public void validate() { int dx = vertexes[0].getX() - vertexes[1].getX(); diff --git a/src/main/java/util/Plate.java b/src/main/java/util/Plate.java new file mode 100644 index 00000000..c7e813b4 --- /dev/null +++ b/src/main/java/util/Plate.java @@ -0,0 +1,61 @@ +package util; + +import coordinate.Point; + +import java.util.Arrays; + +public class Plate { + private final String[][] plate; + + public Plate() { + this.plate = new String[26][26]; + for (int i = 0; i < plate.length; i++) { + String[] row = new String[27]; + Arrays.fill(row, " "); + plate[i] = row; + } + + for (int i = 0; i < 24; i++) { + plate[i][1] = "|"; + if ((24 - i) % 2 == 0) { + plate[i][0] = " "; + } else { + plate[i][0] = String.format("%2d", 24 - i); + } + } + + plate[24][0] = " "; + plate[24][1] = "+"; + plate[25][0] = " 0"; + + for (int i = 2; i < 26; i++) { + plate[24][i] = "---"; + if ((24 - i) % 2 != 0) { + plate[25][i] = " "; + } else { + plate[25][i] = String.format(" %-2d", i - 1); + } + } + + plate[24][1] = "+"; + plate[25][1] = " "; + } + + public void drawPoints(Point[] points) { + for (Point point : points) { + plate[24 - point.getX()][point.getY() + 1] = " * "; + } + } + + public void print() { + StringBuilder painter = new StringBuilder(); + for (String[] row : plate) { + for (String data : row) { + painter.append(data); + } + painter.append(System.lineSeparator()); + } + + Terminal.out(painter.toString()); + } +} diff --git a/src/main/java/util/Terminal.java b/src/main/java/util/Terminal.java new file mode 100644 index 00000000..de10119f --- /dev/null +++ b/src/main/java/util/Terminal.java @@ -0,0 +1,19 @@ +package util; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class Terminal { + + private static final BufferedReader BUFFERED_READER = new BufferedReader(new InputStreamReader(System.in)); + + public static String in(String message) throws IOException { + System.out.print(message); + return BUFFERED_READER.readLine(); + } + + public static void out(String message) { + System.out.println(message); + } +} diff --git a/src/test/java/coordinate/CalculatorTest.java b/src/test/java/coordinate/CalculatorTest.java index f0e57a59..7fb6de2f 100644 --- a/src/test/java/coordinate/CalculatorTest.java +++ b/src/test/java/coordinate/CalculatorTest.java @@ -66,7 +66,7 @@ void beforeEach() { points[1] = new Point(14, 15); // when - GeometricElement result = calculator.getShape(points); + GeometricElement result = calculator.getGeometricElement(points); // then assertThat(result.getClass()).isEqualTo(Line.class); From bd57a8dd28e64a63db4cb3344b71d17414171883 Mon Sep 17 00:00:00 2001 From: ywm-sbbaek Date: Wed, 15 Nov 2023 14:25:17 +0900 Subject: [PATCH 09/15] =?UTF-8?q?feat:=20=EC=A2=8C=ED=91=9C=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 12 ++-- src/main/java/coordinate/Calculator.java | 65 +++++++++++++++----- src/test/java/coordinate/CalculatorTest.java | 52 ++++++++-------- 3 files changed, 79 insertions(+), 50 deletions(-) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index f6c92032..00efac62 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -10,12 +10,10 @@ public class Main { public static void main(String[] args) throws IOException { String in = Terminal.in("좌표를 입력하세요." + System.lineSeparator()); Point[] points = Calculator.toPoints(in); - if (Calculator.validatePoints(points)) { - Plate plate = new Plate(); - plate.drawPoints(points); - plate.print(); - GeometricElement geometricElement = Calculator.getGeometricElement(points); - geometricElement.printCalculateResult(); - } + Plate plate = new Plate(); + plate.drawPoints(points); + plate.print(); + GeometricElement geometricElement = Calculator.getGeometricElement(points); + geometricElement.printCalculateResult(); } } diff --git a/src/main/java/coordinate/Calculator.java b/src/main/java/coordinate/Calculator.java index 32dad593..133d8ebb 100644 --- a/src/main/java/coordinate/Calculator.java +++ b/src/main/java/coordinate/Calculator.java @@ -1,34 +1,65 @@ package coordinate; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public class Calculator { - public static boolean validatePoints(Point[] points) { - for (Point point : points) { - if (point.getX() < 1) { - return false; - } + public static Point[] toPoints(String input) { + if (isBlank(input)) { + throw new IllegalArgumentException("No Input."); + } + + Pattern pattern = Pattern.compile("\\(([^)]+)\\)"); + Matcher matcher = pattern.matcher(input); - if (point.getY() > 24) { - return false; + int hit = 0; + while (matcher.find()) { + hit++; + } + Point[] result = new Point[hit]; + + matcher.reset(); + for (int i = 0; i < result.length && matcher.find(); i++) { + String[] coordinate = matcher.group().replaceAll("[()]", "") + .split(","); + + if (coordinate.length != 2 || isBlank(coordinate[0]) || isBlank(coordinate[1])) { + throw new ArithmeticException("The input is not a two dimension point."); } + + int x = validationNumberAndGet(coordinate[0]); + int y = validationNumberAndGet(coordinate[1]); + result[i] = new Point(x, y); } - return true; + return result; } - public static Point[] toPoints(String input) { - String[] points = input.split("-"); - Point[] result = new Point[points.length]; + private static boolean isBlank(String in) { + return in == null || in.trim().isEmpty(); + } - for (int i = 0; i < points.length; i++) { - String[] coordinate = points[i].replace("(", "") - .replace(")", "") - .split(","); + private static int validationNumberAndGet(String in) { + in = in.trim(); + // "-" 부호만 입력 했을 때는 0으로 간주됨 + if (in.charAt(0) != '-' && !Character.isDigit(in.charAt(0))) { + throw new ArithmeticException("The input is not a number."); + } - result[i] = new Point(Integer.parseInt(coordinate[0].trim()), Integer.parseInt(coordinate[1].trim())); + for (int i = 1; i < in.length(); i++) { + boolean isDigit = Character.isDigit(in.charAt(i)); + if (!isDigit) { + throw new ArithmeticException("The input is not a number."); + } } - return result; + int num = Integer.parseInt(in); + if (num < 1 || num > 24) { + throw new IllegalArgumentException("allow range for input is from 1 to 24."); + } + + return num; } public static GeometricElement getGeometricElement(Point[] points) { diff --git a/src/test/java/coordinate/CalculatorTest.java b/src/test/java/coordinate/CalculatorTest.java index 7fb6de2f..45ec7afe 100644 --- a/src/test/java/coordinate/CalculatorTest.java +++ b/src/test/java/coordinate/CalculatorTest.java @@ -1,58 +1,58 @@ package coordinate; -import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; import static coordinate.PointConverter.getPoints; import static org.assertj.core.api.Assertions.assertThat; public class CalculatorTest { - private Calculator calculator; + @ParameterizedTest + @ValueSource(strings = {"(25,10)-(10,25)", "(0,13)-(23,0)", "(-1,17)-(8,-1)"}) + void 좌표_입력_테스트_범위_초과(String input) { + // when + // then + IllegalArgumentException result = Assertions.assertThrows(IllegalArgumentException.class, () -> Calculator.toPoints(input)); - @BeforeEach - void beforeEach() { - this.calculator = new Calculator(); + assertThat(result.getMessage()).contains("input is from 1 to 24"); } @ParameterizedTest - @CsvSource(value = {"[24,10]:[10,24]", "[1,5]:[5,1]"}, delimiter = ':') - void 좌표_입력_테스트_범위값(String xStr, String yStr) { - // given - Point[] points = getPoints(xStr, yStr); - + @ValueSource(strings = {"(ㄱ,10)-(10,3)", "(4,A)-(23,5)", "(10,17)-(8,$)"}) + void 좌표_입력_테스트_숫자가_아님(String input) { // when - boolean result = calculator.validatePoints(points); - // then - assertThat(result).isTrue(); + ArithmeticException result = Assertions.assertThrows(ArithmeticException.class, () -> Calculator.toPoints(input)); + + assertThat(result.getMessage()).contains("The input is not a number"); } @ParameterizedTest - @CsvSource(value = {"[25,10]:[10,25]", "[0,23]:[13,0]", "[-1,8]:[17,-1]"}, delimiter = ':') - void 좌표_입력_테스트_범위_초과(String xStr, String yStr) { - // given - Point[] points = getPoints(xStr, yStr); - + @ValueSource(strings = {"(,3)-(5,2)", "(4,1)-(2,)", "(4,1)-( ,5)", "(5, )-(2,3)"}) + void 좌표_입력_테스트_공백_입력됨(String input) { // when - boolean result = calculator.validatePoints(points); - // then - assertThat(result).isFalse(); + ArithmeticException result = Assertions.assertThrows(ArithmeticException.class, () -> Calculator.toPoints(input)); + + assertThat(result.getMessage()).contains("The input is not a two dimension point."); } @ParameterizedTest - @CsvSource(value = {"(10,10)-(14,15):[10,14]:[10,15]"}, delimiter = ':') + @CsvSource(value = { + "(10,10)-(14,15):[10,14]:[10,15]", + "(24,10)-(10,24):[24,10]:[10,24]", + "(1,5)-(5,1):[1,5]:[5,1]" + }, delimiter = ':') void 좌표_입력_테스트(String input, String xStr, String yStr) { // given Point[] points = getPoints(xStr, yStr); - // when - Point[] result = calculator.toPoints(input); - + Point[] result = Calculator.toPoints(input); // then assertThat(result).containsExactly(points); @@ -66,7 +66,7 @@ void beforeEach() { points[1] = new Point(14, 15); // when - GeometricElement result = calculator.getGeometricElement(points); + GeometricElement result = Calculator.getGeometricElement(points); // then assertThat(result.getClass()).isEqualTo(Line.class); From 024a233fafbe6d20dbd4e12f966cb13acced13d3 Mon Sep 17 00:00:00 2001 From: ywm-sbbaek Date: Wed, 15 Nov 2023 14:57:29 +0900 Subject: [PATCH 10/15] =?UTF-8?q?refactor:=20equals=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95(=EA=B0=99=EC=9D=80=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EA=B2=8C=ED=84=B0=20=ED=98=B8=EC=B6=9C=20?= =?UTF-8?q?->=20=EC=A7=81=EC=A0=91=20=ED=95=84=EB=93=9C=20=EC=B0=B8?= =?UTF-8?q?=EC=A1=B0=20=EA=B0=80=EB=8A=A5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/Point.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/coordinate/Point.java b/src/main/java/coordinate/Point.java index 9ab544fb..bc8de8e9 100644 --- a/src/main/java/coordinate/Point.java +++ b/src/main/java/coordinate/Point.java @@ -32,6 +32,6 @@ public boolean equals(Object obj) { } Point compare = (Point) obj; - return compare.getX() == this.x && compare.getY() == this.y; + return compare.x == this.x && compare.y == this.y; } } From 74a7a102c2b63f5eca418db17238a84046a81122 Mon Sep 17 00:00:00 2001 From: ywm-sbbaek Date: Wed, 15 Nov 2023 15:23:38 +0900 Subject: [PATCH 11/15] =?UTF-8?q?refactor:=20=ED=8C=A9=ED=86=A0=EB=A6=AC?= =?UTF-8?q?=20=ED=8C=A8=ED=84=B4=20=EC=82=AC=EC=9A=A9=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=B4=20=EC=83=9D=EC=84=B1=EC=9E=90=20Parameter=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20-=20=EA=B8=B0=EC=A1=B4=EC=97=90=20Point=EB=A5=BC=20?= =?UTF-8?q?=EA=B0=81=EA=B0=81=20=EB=B0=9B=EB=8D=98=20=EA=B2=83=EC=9D=84=20?= =?UTF-8?q?Point=EC=9D=98=20=EB=B0=B0=EC=97=B4=EB=A1=9C=20=EB=B0=9B?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/Calculator.java | 6 ++-- src/main/java/coordinate/Line.java | 8 +++-- src/main/java/coordinate/Rectangle.java | 37 ++++++++++----------- src/main/java/coordinate/Triangle.java | 8 ++--- src/test/java/coordinate/LineTest.java | 4 +-- src/test/java/coordinate/RectangleTest.java | 8 ++--- src/test/java/coordinate/TriangleTest.java | 6 ++-- 7 files changed, 35 insertions(+), 42 deletions(-) diff --git a/src/main/java/coordinate/Calculator.java b/src/main/java/coordinate/Calculator.java index 133d8ebb..395ccfb0 100644 --- a/src/main/java/coordinate/Calculator.java +++ b/src/main/java/coordinate/Calculator.java @@ -64,15 +64,15 @@ private static int validationNumberAndGet(String in) { public static GeometricElement getGeometricElement(Point[] points) { if (points.length == 2) { - return new Line(points[0], points[1]); + return new Line(points); } if (points.length == 4) { - return new Rectangle(points[0], points[1], points[2], points[3]); + return new Rectangle(points); } if (points.length == 3) { - return new Triangle(points[0], points[1], points[2]); + return new Triangle(points); } throw new ArithmeticException("No Line or Shape"); diff --git a/src/main/java/coordinate/Line.java b/src/main/java/coordinate/Line.java index f7317289..86c5af9f 100644 --- a/src/main/java/coordinate/Line.java +++ b/src/main/java/coordinate/Line.java @@ -7,10 +7,12 @@ public class Line implements GeometricElement { private final Point[] points; + public Line(Point[] in) { + points = Arrays.copyOf(in, 2); + } + public Line(Point point1, Point point2) { - points = new Point[2]; - points[0] = point1; - points[1] = point2; + this(new Point[]{point1, point2}); } public Point[] getEndPoints() { diff --git a/src/main/java/coordinate/Rectangle.java b/src/main/java/coordinate/Rectangle.java index d936314e..efc42dde 100644 --- a/src/main/java/coordinate/Rectangle.java +++ b/src/main/java/coordinate/Rectangle.java @@ -4,35 +4,19 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; public class Rectangle implements GeometricElement, Shape { private final Point[] vertexes; - public Rectangle(Point point1, Point point2, Point point3, Point point4) { - List points = new ArrayList<>(); - points.add(point1); - points.add(point2); - points.add(point3); - points.add(point4); - + public Rectangle(Point[] in) { + List points = new ArrayList<>(4); + Collections.addAll(points, in); this.vertexes = getSortedVertexes(points); validate(); } - @Override - public void validate() { - boolean result1; - boolean result2; - - result1 = isRightAngle(new Line(vertexes[0], vertexes[2]), new Line(vertexes[0], vertexes[3])); - result2 = isRightAngle(new Line(vertexes[1], vertexes[2]), new Line(vertexes[1], vertexes[3])); - - if (!(result1 && result2)) { - throw new ArithmeticException("No Rectangle."); - } - } - /** * 네 점을 다음과 같이 대칭 점끼리 묶어서 정렬 * 1. 한 점을 고른다 @@ -68,6 +52,19 @@ private Point[] getSortedVertexes(List points) { return sortedVertexes; } + @Override + public void validate() { + boolean result1; + boolean result2; + + result1 = isRightAngle(new Line(vertexes[0], vertexes[2]), new Line(vertexes[0], vertexes[3])); + result2 = isRightAngle(new Line(vertexes[1], vertexes[2]), new Line(vertexes[1], vertexes[3])); + + if (!(result1 && result2)) { + throw new ArithmeticException("No Rectangle."); + } + } + private boolean isRightAngle(Line line1, Line line2) { Point[] p1 = line1.getEndPoints(); double angle1 = getAngle(p1[0], p1[1]); diff --git a/src/main/java/coordinate/Triangle.java b/src/main/java/coordinate/Triangle.java index 8303d488..90056fa1 100644 --- a/src/main/java/coordinate/Triangle.java +++ b/src/main/java/coordinate/Triangle.java @@ -8,12 +8,8 @@ public class Triangle implements GeometricElement, Shape { private final Point[] vertexes; - public Triangle(Point point1, Point point2, Point point3) { - vertexes = new Point[3]; - - vertexes[0] = point1; - vertexes[1] = point2; - vertexes[2] = point3; + public Triangle(Point[] in) { + vertexes = Arrays.copyOf(in, 3); validate(); } diff --git a/src/test/java/coordinate/LineTest.java b/src/test/java/coordinate/LineTest.java index 7a62340f..e3cfa5f6 100644 --- a/src/test/java/coordinate/LineTest.java +++ b/src/test/java/coordinate/LineTest.java @@ -14,7 +14,7 @@ class LineTest { void 생성(String xStr, String yStr) { // given Point[] points = getPoints(xStr, yStr); - Line line = new Line(points[0], points[1]); + Line line = new Line(points); // when Point[] result = line.getEndPoints(); @@ -28,7 +28,7 @@ class LineTest { void 거리_계산(String xStr, String yStr) { // given Point[] points = getPoints(xStr, yStr); - Line line = new Line(points[0], points[1]); + Line line = new Line(points); // when double result = line.calculate(); diff --git a/src/test/java/coordinate/RectangleTest.java b/src/test/java/coordinate/RectangleTest.java index 0db50be1..9ec60ef6 100644 --- a/src/test/java/coordinate/RectangleTest.java +++ b/src/test/java/coordinate/RectangleTest.java @@ -3,8 +3,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; -import java.io.IOException; - import static coordinate.PointConverter.getPoints; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.offset; @@ -19,7 +17,7 @@ public class RectangleTest { Point[] points = getPoints(xStr, yStr); // when - Rectangle rectangle = new Rectangle(points[0], points[1], points[2], points[3]); + Rectangle rectangle = new Rectangle(points); Point[] result = rectangle.getVertex(); // then @@ -35,7 +33,7 @@ public class RectangleTest { // when // then ArithmeticException result = assertThrows(ArithmeticException.class, - () -> new Rectangle(points[0], points[1], points[2], points[3])); + () -> new Rectangle(points)); assertThat(result.getMessage()).contains("No Rectangle"); } @@ -45,7 +43,7 @@ public class RectangleTest { void 넓이_계산(String xStr, String yStr) { // given Point[] points = getPoints(xStr, yStr); - Rectangle rectangle = new Rectangle(points[0], points[1], points[2], points[3]); + Rectangle rectangle = new Rectangle(points); // when double result = rectangle.calculate(); diff --git a/src/test/java/coordinate/TriangleTest.java b/src/test/java/coordinate/TriangleTest.java index 1e106a39..e07408ba 100644 --- a/src/test/java/coordinate/TriangleTest.java +++ b/src/test/java/coordinate/TriangleTest.java @@ -17,7 +17,7 @@ public class TriangleTest { Point[] points = getPoints(xStr, yStr); // when - Triangle triangle = new Triangle(points[0], points[1], points[2]); + Triangle triangle = new Triangle(points); Point[] result = triangle.getVertex(); // then @@ -33,7 +33,7 @@ public class TriangleTest { // when // then ArithmeticException result = assertThrows(ArithmeticException.class, - () -> new Triangle(points[0], points[1], points[2])); + () -> new Triangle(points)); assertThat(result.getMessage()).contains("No Triangle"); } @@ -43,7 +43,7 @@ public class TriangleTest { void 넓이_계산(String xStr, String yStr) { // given Point[] points = getPoints(xStr, yStr); - Triangle triangle = new Triangle(points[0], points[1], points[2]); + Triangle triangle = new Triangle(points); // when double result = triangle.calculate(); From 41c1fdb9debf160445610532ac13c7635ac008e9 Mon Sep 17 00:00:00 2001 From: ywm-sbbaek Date: Wed, 15 Nov 2023 17:45:33 +0900 Subject: [PATCH 12/15] =?UTF-8?q?refactor:=20Shape=EB=A5=BC=20=EC=B6=94?= =?UTF-8?q?=EC=83=81=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/Rectangle.java | 20 ++++++++------------ src/main/java/coordinate/Shape.java | 13 ++++++++++--- src/main/java/coordinate/Triangle.java | 8 +++----- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/main/java/coordinate/Rectangle.java b/src/main/java/coordinate/Rectangle.java index efc42dde..0d0cf2e7 100644 --- a/src/main/java/coordinate/Rectangle.java +++ b/src/main/java/coordinate/Rectangle.java @@ -7,13 +7,13 @@ import java.util.Collections; import java.util.List; -public class Rectangle implements GeometricElement, Shape { - private final Point[] vertexes; +public class Rectangle extends Shape implements GeometricElement { public Rectangle(Point[] in) { + super(in); List points = new ArrayList<>(4); Collections.addAll(points, in); - this.vertexes = getSortedVertexes(points); + getSortedVertexes(points); validate(); } @@ -24,14 +24,10 @@ public Rectangle(Point[] in) { * 3. 위의 두 점을 순서 대로 배열에 저장 * 4. 나머지 두 점을 이어서 배열에 저장 (나머지 두점은 또 서로의 대칭점) * @param points 입력 받은 점들 - * @return 정렬된 점(꼭지점)들 */ - private Point[] getSortedVertexes(List points) { - Point[] sortedVertexes = new Point[4]; - + private void getSortedVertexes(List points) { Point base = points.get(0); points.remove(base); - sortedVertexes[0] = base; Point opposite = points.get(0); double maxLength = new Line(base, opposite).calculate(); @@ -45,11 +41,11 @@ private Point[] getSortedVertexes(List points) { } points.remove(opposite); - sortedVertexes[1] = opposite; - sortedVertexes[2] = points.get(0); - sortedVertexes[3] = points.get(1); - return sortedVertexes; + vertexes[0] = base; + vertexes[1] = opposite; + vertexes[2] = points.get(0); + vertexes[3] = points.get(1); } @Override diff --git a/src/main/java/coordinate/Shape.java b/src/main/java/coordinate/Shape.java index 5337b3ff..a3e678ca 100644 --- a/src/main/java/coordinate/Shape.java +++ b/src/main/java/coordinate/Shape.java @@ -1,7 +1,14 @@ package coordinate; -public interface Shape { - void validate(); +public abstract class Shape { - Point[] getVertex(); + protected final Point[] vertexes; + + protected Shape(Point[] in) { + this.vertexes = new Point[in.length]; + } + + abstract void validate(); + + abstract Point[] getVertex(); } diff --git a/src/main/java/coordinate/Triangle.java b/src/main/java/coordinate/Triangle.java index 90056fa1..970cf1bc 100644 --- a/src/main/java/coordinate/Triangle.java +++ b/src/main/java/coordinate/Triangle.java @@ -4,13 +4,11 @@ import java.util.Arrays; -public class Triangle implements GeometricElement, Shape { - - private final Point[] vertexes; +public class Triangle extends Shape implements GeometricElement { public Triangle(Point[] in) { - vertexes = Arrays.copyOf(in, 3); - + super(in); + System.arraycopy(in, 0, vertexes, 0, in.length); validate(); } From 69b1cb51012d326adbb04e06b2c210ca7fc476fe Mon Sep 17 00:00:00 2001 From: ywm-sbbaek Date: Thu, 16 Nov 2023 16:09:32 +0900 Subject: [PATCH 13/15] =?UTF-8?q?refactor:=20=EC=84=A0=EA=B3=BC=20?= =?UTF-8?q?=EB=8F=84=ED=98=95=EC=9D=98=20=EC=83=9D=EC=84=B1=EC=9D=84=20?= =?UTF-8?q?=EC=B1=85=EC=9E=84=EC=A7=80=EB=8A=94=20=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EA=B5=AC=ED=98=84,=20=EB=A7=A4=EC=A7=81=20?= =?UTF-8?q?=EB=84=98=EB=B2=84=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8F=84=EB=A1=9D=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 7 +-- src/main/java/coordinate/Calculator.java | 23 +++----- .../GeometricElement.java | 2 +- .../geometricelement/GeometricFactory.java | 33 ++++++++++++ .../{ => geometricelement}/Line.java | 4 +- .../{ => geometricelement}/Point.java | 2 +- .../{ => geometricelement}/Rectangle.java | 4 +- .../{ => geometricelement}/Shape.java | 2 +- .../{ => geometricelement}/Triangle.java | 4 +- src/main/java/util/Plate.java | 2 +- src/test/java/coordinate/CalculatorTest.java | 16 +----- src/test/java/coordinate/PointConverter.java | 2 + .../GeometricElementFactoryTest.java | 53 +++++++++++++++++++ .../{ => geometricelement}/LineTest.java | 2 +- .../{ => geometricelement}/RectangleTest.java | 2 +- .../{ => geometricelement}/TriangleTest.java | 2 +- 16 files changed, 112 insertions(+), 48 deletions(-) rename src/main/java/coordinate/{ => geometricelement}/GeometricElement.java (72%) create mode 100644 src/main/java/coordinate/geometricelement/GeometricFactory.java rename src/main/java/coordinate/{ => geometricelement}/Line.java (91%) rename src/main/java/coordinate/{ => geometricelement}/Point.java (94%) rename src/main/java/coordinate/{ => geometricelement}/Rectangle.java (97%) rename src/main/java/coordinate/{ => geometricelement}/Shape.java (85%) rename src/main/java/coordinate/{ => geometricelement}/Triangle.java (94%) create mode 100644 src/test/java/coordinate/geometricelement/GeometricElementFactoryTest.java rename src/test/java/coordinate/{ => geometricelement}/LineTest.java (96%) rename src/test/java/coordinate/{ => geometricelement}/RectangleTest.java (97%) rename src/test/java/coordinate/{ => geometricelement}/TriangleTest.java (97%) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 00efac62..cdf3e9b0 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,6 +1,7 @@ import coordinate.Calculator; -import coordinate.GeometricElement; -import coordinate.Point; +import coordinate.geometricelement.GeometricElement; +import coordinate.geometricelement.GeometricFactory; +import coordinate.geometricelement.Point; import util.Plate; import util.Terminal; @@ -13,7 +14,7 @@ public static void main(String[] args) throws IOException { Plate plate = new Plate(); plate.drawPoints(points); plate.print(); - GeometricElement geometricElement = Calculator.getGeometricElement(points); + GeometricElement geometricElement = GeometricFactory.getGeometricElement(points); geometricElement.printCalculateResult(); } } diff --git a/src/main/java/coordinate/Calculator.java b/src/main/java/coordinate/Calculator.java index 395ccfb0..9074062a 100644 --- a/src/main/java/coordinate/Calculator.java +++ b/src/main/java/coordinate/Calculator.java @@ -1,5 +1,7 @@ package coordinate; +import coordinate.geometricelement.Point; + import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -54,27 +56,14 @@ private static int validationNumberAndGet(String in) { } } + int rangeMin = 1; + int rangeMax = 24; + int num = Integer.parseInt(in); - if (num < 1 || num > 24) { + if (num < rangeMin || num > rangeMax) { throw new IllegalArgumentException("allow range for input is from 1 to 24."); } return num; } - - public static GeometricElement getGeometricElement(Point[] points) { - if (points.length == 2) { - return new Line(points); - } - - if (points.length == 4) { - return new Rectangle(points); - } - - if (points.length == 3) { - return new Triangle(points); - } - - throw new ArithmeticException("No Line or Shape"); - } } diff --git a/src/main/java/coordinate/GeometricElement.java b/src/main/java/coordinate/geometricelement/GeometricElement.java similarity index 72% rename from src/main/java/coordinate/GeometricElement.java rename to src/main/java/coordinate/geometricelement/GeometricElement.java index 97f99772..04db3503 100644 --- a/src/main/java/coordinate/GeometricElement.java +++ b/src/main/java/coordinate/geometricelement/GeometricElement.java @@ -1,4 +1,4 @@ -package coordinate; +package coordinate.geometricelement; public interface GeometricElement { double calculate(); diff --git a/src/main/java/coordinate/geometricelement/GeometricFactory.java b/src/main/java/coordinate/geometricelement/GeometricFactory.java new file mode 100644 index 00000000..1bdc69d0 --- /dev/null +++ b/src/main/java/coordinate/geometricelement/GeometricFactory.java @@ -0,0 +1,33 @@ +package coordinate.geometricelement; + +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + +public class GeometricFactory { + + private final static Map> GEOMETRIC_ELEMENTS = new HashMap<>(); + + static { + int linesPointCount = 2; + int rectanglesPointCount = 4; + int trianglesPointCount = 3; + + GEOMETRIC_ELEMENTS.put(linesPointCount, Line.class); + GEOMETRIC_ELEMENTS.put(rectanglesPointCount, Rectangle.class); + GEOMETRIC_ELEMENTS.put(trianglesPointCount, Triangle.class); + } + + public static GeometricElement getGeometricElement(Point[] points) { + if (!GEOMETRIC_ELEMENTS.containsKey(points.length)) { + throw new ArithmeticException("No Line or Shape"); + } + + try { + Class geometricElementClass = GEOMETRIC_ELEMENTS.get(points.length); + return geometricElementClass.getDeclaredConstructor(Point[].class).newInstance((Object) points); + } catch (InvocationTargetException | InstantiationException | IllegalAccessException | NoSuchMethodException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/coordinate/Line.java b/src/main/java/coordinate/geometricelement/Line.java similarity index 91% rename from src/main/java/coordinate/Line.java rename to src/main/java/coordinate/geometricelement/Line.java index 86c5af9f..c43097a0 100644 --- a/src/main/java/coordinate/Line.java +++ b/src/main/java/coordinate/geometricelement/Line.java @@ -1,4 +1,4 @@ -package coordinate; +package coordinate.geometricelement; import util.Terminal; @@ -7,7 +7,7 @@ public class Line implements GeometricElement { private final Point[] points; - public Line(Point[] in) { + protected Line(Point[] in) { points = Arrays.copyOf(in, 2); } diff --git a/src/main/java/coordinate/Point.java b/src/main/java/coordinate/geometricelement/Point.java similarity index 94% rename from src/main/java/coordinate/Point.java rename to src/main/java/coordinate/geometricelement/Point.java index bc8de8e9..6392153a 100644 --- a/src/main/java/coordinate/Point.java +++ b/src/main/java/coordinate/geometricelement/Point.java @@ -1,4 +1,4 @@ -package coordinate; +package coordinate.geometricelement; public class Point { private final int x; diff --git a/src/main/java/coordinate/Rectangle.java b/src/main/java/coordinate/geometricelement/Rectangle.java similarity index 97% rename from src/main/java/coordinate/Rectangle.java rename to src/main/java/coordinate/geometricelement/Rectangle.java index 0d0cf2e7..605f2681 100644 --- a/src/main/java/coordinate/Rectangle.java +++ b/src/main/java/coordinate/geometricelement/Rectangle.java @@ -1,4 +1,4 @@ -package coordinate; +package coordinate.geometricelement; import util.Terminal; @@ -9,7 +9,7 @@ public class Rectangle extends Shape implements GeometricElement { - public Rectangle(Point[] in) { + protected Rectangle(Point[] in) { super(in); List points = new ArrayList<>(4); Collections.addAll(points, in); diff --git a/src/main/java/coordinate/Shape.java b/src/main/java/coordinate/geometricelement/Shape.java similarity index 85% rename from src/main/java/coordinate/Shape.java rename to src/main/java/coordinate/geometricelement/Shape.java index a3e678ca..79731d34 100644 --- a/src/main/java/coordinate/Shape.java +++ b/src/main/java/coordinate/geometricelement/Shape.java @@ -1,4 +1,4 @@ -package coordinate; +package coordinate.geometricelement; public abstract class Shape { diff --git a/src/main/java/coordinate/Triangle.java b/src/main/java/coordinate/geometricelement/Triangle.java similarity index 94% rename from src/main/java/coordinate/Triangle.java rename to src/main/java/coordinate/geometricelement/Triangle.java index 970cf1bc..a99c57e9 100644 --- a/src/main/java/coordinate/Triangle.java +++ b/src/main/java/coordinate/geometricelement/Triangle.java @@ -1,4 +1,4 @@ -package coordinate; +package coordinate.geometricelement; import util.Terminal; @@ -6,7 +6,7 @@ public class Triangle extends Shape implements GeometricElement { - public Triangle(Point[] in) { + protected Triangle(Point[] in) { super(in); System.arraycopy(in, 0, vertexes, 0, in.length); validate(); diff --git a/src/main/java/util/Plate.java b/src/main/java/util/Plate.java index c7e813b4..f3088751 100644 --- a/src/main/java/util/Plate.java +++ b/src/main/java/util/Plate.java @@ -1,6 +1,6 @@ package util; -import coordinate.Point; +import coordinate.geometricelement.Point; import java.util.Arrays; diff --git a/src/test/java/coordinate/CalculatorTest.java b/src/test/java/coordinate/CalculatorTest.java index 45ec7afe..3f72fe39 100644 --- a/src/test/java/coordinate/CalculatorTest.java +++ b/src/test/java/coordinate/CalculatorTest.java @@ -1,7 +1,7 @@ package coordinate; +import coordinate.geometricelement.Point; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; @@ -57,18 +57,4 @@ public class CalculatorTest { // then assertThat(result).containsExactly(points); } - - @Test - void 좌표_두개_입력() { - // given - Point[] points = new Point[2]; - points[0] = new Point(10, 10); - points[1] = new Point(14, 15); - - // when - GeometricElement result = Calculator.getGeometricElement(points); - - // then - assertThat(result.getClass()).isEqualTo(Line.class); - } } \ No newline at end of file diff --git a/src/test/java/coordinate/PointConverter.java b/src/test/java/coordinate/PointConverter.java index 3cb354ea..4c6e7f64 100644 --- a/src/test/java/coordinate/PointConverter.java +++ b/src/test/java/coordinate/PointConverter.java @@ -1,5 +1,7 @@ package coordinate; +import coordinate.geometricelement.Point; + import java.util.Arrays; public class PointConverter { diff --git a/src/test/java/coordinate/geometricelement/GeometricElementFactoryTest.java b/src/test/java/coordinate/geometricelement/GeometricElementFactoryTest.java new file mode 100644 index 00000000..b074c1cc --- /dev/null +++ b/src/test/java/coordinate/geometricelement/GeometricElementFactoryTest.java @@ -0,0 +1,53 @@ +package coordinate.geometricelement; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class GeometricElementFactoryTest { + + @Test + void 좌표_두개_입력() { + // given + Point[] points = new Point[2]; + points[0] = new Point(10, 10); + points[1] = new Point(14, 15); + + // when + GeometricElement result = GeometricFactory.getGeometricElement(points); + + // then + assertThat(result.getClass()).isEqualTo(Line.class); + } + + @Test + void 좌표_네개_입력() { + // given + Point[] points = new Point[4]; + points[0] = new Point(10, 10); + points[1] = new Point(22, 10); + points[2] = new Point(22, 18); + points[3] = new Point(10, 18); + + // when + GeometricElement result = GeometricFactory.getGeometricElement(points); + + // then + assertThat(result.getClass()).isEqualTo(Rectangle.class); + } + + @Test + void 좌표_세개_입력() { + // given + Point[] points = new Point[3]; + points[0] = new Point(10, 10); + points[1] = new Point(14, 15); + points[2] = new Point(20, 8); + + // when + GeometricElement result = GeometricFactory.getGeometricElement(points); + + // then + assertThat(result.getClass()).isEqualTo(Triangle.class); + } +} diff --git a/src/test/java/coordinate/LineTest.java b/src/test/java/coordinate/geometricelement/LineTest.java similarity index 96% rename from src/test/java/coordinate/LineTest.java rename to src/test/java/coordinate/geometricelement/LineTest.java index e3cfa5f6..ce2716ca 100644 --- a/src/test/java/coordinate/LineTest.java +++ b/src/test/java/coordinate/geometricelement/LineTest.java @@ -1,4 +1,4 @@ -package coordinate; +package coordinate.geometricelement; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; diff --git a/src/test/java/coordinate/RectangleTest.java b/src/test/java/coordinate/geometricelement/RectangleTest.java similarity index 97% rename from src/test/java/coordinate/RectangleTest.java rename to src/test/java/coordinate/geometricelement/RectangleTest.java index 9ec60ef6..12adc4cf 100644 --- a/src/test/java/coordinate/RectangleTest.java +++ b/src/test/java/coordinate/geometricelement/RectangleTest.java @@ -1,4 +1,4 @@ -package coordinate; +package coordinate.geometricelement; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; diff --git a/src/test/java/coordinate/TriangleTest.java b/src/test/java/coordinate/geometricelement/TriangleTest.java similarity index 97% rename from src/test/java/coordinate/TriangleTest.java rename to src/test/java/coordinate/geometricelement/TriangleTest.java index e07408ba..5bb44b9c 100644 --- a/src/test/java/coordinate/TriangleTest.java +++ b/src/test/java/coordinate/geometricelement/TriangleTest.java @@ -1,4 +1,4 @@ -package coordinate; +package coordinate.geometricelement; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; From fb22190de2bf71b39b9d44d6f15b4ceb70ab74c6 Mon Sep 17 00:00:00 2001 From: ywm-sbbaek Date: Thu, 16 Nov 2023 16:35:33 +0900 Subject: [PATCH 14/15] =?UTF-8?q?refactor:=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EB=A9=94=EC=84=B8=EC=A7=80=EB=A5=BC=20=EB=AA=A8=EC=9D=80=20?= =?UTF-8?q?=EC=97=B4=EA=B1=B0=ED=98=95=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/Calculator.java | 12 +++++----- .../geometricelement/GeometricFactory.java | 4 +++- .../geometricelement/Rectangle.java | 4 +++- .../coordinate/geometricelement/Triangle.java | 4 +++- src/main/java/exception/ExceptionMessage.java | 22 +++++++++++++++++++ 5 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 src/main/java/exception/ExceptionMessage.java diff --git a/src/main/java/coordinate/Calculator.java b/src/main/java/coordinate/Calculator.java index 9074062a..d98b1d91 100644 --- a/src/main/java/coordinate/Calculator.java +++ b/src/main/java/coordinate/Calculator.java @@ -5,11 +5,13 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import static exception.ExceptionMessage.*; + public class Calculator { public static Point[] toPoints(String input) { if (isBlank(input)) { - throw new IllegalArgumentException("No Input."); + throw new IllegalArgumentException(NO_INPUT.getMessage()); } Pattern pattern = Pattern.compile("\\(([^)]+)\\)"); @@ -27,7 +29,7 @@ public static Point[] toPoints(String input) { .split(","); if (coordinate.length != 2 || isBlank(coordinate[0]) || isBlank(coordinate[1])) { - throw new ArithmeticException("The input is not a two dimension point."); + throw new ArithmeticException(NO_TWO_DIMENSION_POINT.getMessage()); } int x = validationNumberAndGet(coordinate[0]); @@ -46,13 +48,13 @@ private static int validationNumberAndGet(String in) { in = in.trim(); // "-" 부호만 입력 했을 때는 0으로 간주됨 if (in.charAt(0) != '-' && !Character.isDigit(in.charAt(0))) { - throw new ArithmeticException("The input is not a number."); + throw new ArithmeticException(INPUT_NOT_NUMBER.getMessage()); } for (int i = 1; i < in.length(); i++) { boolean isDigit = Character.isDigit(in.charAt(i)); if (!isDigit) { - throw new ArithmeticException("The input is not a number."); + throw new ArithmeticException(INPUT_NOT_NUMBER.getMessage()); } } @@ -61,7 +63,7 @@ private static int validationNumberAndGet(String in) { int num = Integer.parseInt(in); if (num < rangeMin || num > rangeMax) { - throw new IllegalArgumentException("allow range for input is from 1 to 24."); + throw new IllegalArgumentException(String.format(INPUT_OUT_OF_RANGE.getMessage(), rangeMin, rangeMax)); } return num; diff --git a/src/main/java/coordinate/geometricelement/GeometricFactory.java b/src/main/java/coordinate/geometricelement/GeometricFactory.java index 1bdc69d0..6bae53cd 100644 --- a/src/main/java/coordinate/geometricelement/GeometricFactory.java +++ b/src/main/java/coordinate/geometricelement/GeometricFactory.java @@ -4,6 +4,8 @@ import java.util.HashMap; import java.util.Map; +import static exception.ExceptionMessage.NO_LINE_OR_SHAPE; + public class GeometricFactory { private final static Map> GEOMETRIC_ELEMENTS = new HashMap<>(); @@ -20,7 +22,7 @@ public class GeometricFactory { public static GeometricElement getGeometricElement(Point[] points) { if (!GEOMETRIC_ELEMENTS.containsKey(points.length)) { - throw new ArithmeticException("No Line or Shape"); + throw new ArithmeticException(NO_LINE_OR_SHAPE.getMessage()); } try { diff --git a/src/main/java/coordinate/geometricelement/Rectangle.java b/src/main/java/coordinate/geometricelement/Rectangle.java index 605f2681..192a7b34 100644 --- a/src/main/java/coordinate/geometricelement/Rectangle.java +++ b/src/main/java/coordinate/geometricelement/Rectangle.java @@ -7,6 +7,8 @@ import java.util.Collections; import java.util.List; +import static exception.ExceptionMessage.NO_SHAPE; + public class Rectangle extends Shape implements GeometricElement { protected Rectangle(Point[] in) { @@ -57,7 +59,7 @@ public void validate() { result2 = isRightAngle(new Line(vertexes[1], vertexes[2]), new Line(vertexes[1], vertexes[3])); if (!(result1 && result2)) { - throw new ArithmeticException("No Rectangle."); + throw new ArithmeticException(String.format(NO_SHAPE.getMessage(), this.getClass().getSimpleName())); } } diff --git a/src/main/java/coordinate/geometricelement/Triangle.java b/src/main/java/coordinate/geometricelement/Triangle.java index a99c57e9..dc103049 100644 --- a/src/main/java/coordinate/geometricelement/Triangle.java +++ b/src/main/java/coordinate/geometricelement/Triangle.java @@ -4,6 +4,8 @@ import java.util.Arrays; +import static exception.ExceptionMessage.NO_SHAPE; + public class Triangle extends Shape implements GeometricElement { protected Triangle(Point[] in) { @@ -42,7 +44,7 @@ public void validate() { double slope2 = Math.abs((double) dy / dx); if (slope1 == slope2) { - throw new ArithmeticException("No Triangle."); + throw new ArithmeticException(String.format(NO_SHAPE.getMessage(), this.getClass().getSimpleName())); } } diff --git a/src/main/java/exception/ExceptionMessage.java b/src/main/java/exception/ExceptionMessage.java new file mode 100644 index 00000000..08dfbaa3 --- /dev/null +++ b/src/main/java/exception/ExceptionMessage.java @@ -0,0 +1,22 @@ +package exception; + +public enum ExceptionMessage { + NO_INPUT("No Input."), + NO_TWO_DIMENSION_POINT("The input is not a two dimension point."), + INPUT_NOT_NUMBER("The input is not a number."), + INPUT_OUT_OF_RANGE("allow range for input is from %d to %d."), + NO_LINE_OR_SHAPE("No Line or Shape."), + NO_SHAPE("No %s."); + + + private final String message; + + ExceptionMessage(String message) { + this.message = message; + } + + public String getMessage() { + return this.message; + } + +} From 7bd93971387a9d8e92a938f21e970f1e95210f02 Mon Sep 17 00:00:00 2001 From: ywm-sbbaek Date: Thu, 16 Nov 2023 17:25:59 +0900 Subject: [PATCH 15/15] =?UTF-8?q?refactor:=20Calculator=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=9D=98=20=EC=97=AD=ED=95=A0=EA=B3=BC=20?= =?UTF-8?q?=EC=B1=85=EC=9E=84=EC=9D=B4=20=EB=AA=A8=ED=98=B8=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD,=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 10 +++++----- .../{geometricelement => }/GeometricElement.java | 2 +- .../{geometricelement => }/GeometricFactory.java | 2 +- .../java/coordinate/{geometricelement => }/Line.java | 2 +- .../java/coordinate/{geometricelement => }/Point.java | 2 +- .../coordinate/{Calculator.java => PointMaker.java} | 4 +--- .../coordinate/{geometricelement => }/Rectangle.java | 2 +- .../java/coordinate/{geometricelement => }/Shape.java | 2 +- .../coordinate/{geometricelement => }/Triangle.java | 2 +- src/main/java/util/Plate.java | 2 +- .../GeometricElementFactoryTest.java | 2 +- .../coordinate/{geometricelement => }/LineTest.java | 2 +- src/test/java/coordinate/PointConverter.java | 2 -- .../{CalculatorTest.java => PointMakerTest.java} | 11 +++++------ .../{geometricelement => }/RectangleTest.java | 2 +- .../{geometricelement => }/TriangleTest.java | 2 +- 16 files changed, 23 insertions(+), 28 deletions(-) rename src/main/java/coordinate/{geometricelement => }/GeometricElement.java (72%) rename src/main/java/coordinate/{geometricelement => }/GeometricFactory.java (97%) rename src/main/java/coordinate/{geometricelement => }/Line.java (95%) rename src/main/java/coordinate/{geometricelement => }/Point.java (94%) rename src/main/java/coordinate/{Calculator.java => PointMaker.java} (96%) rename src/main/java/coordinate/{geometricelement => }/Rectangle.java (98%) rename src/main/java/coordinate/{geometricelement => }/Shape.java (85%) rename src/main/java/coordinate/{geometricelement => }/Triangle.java (97%) rename src/test/java/coordinate/{geometricelement => }/GeometricElementFactoryTest.java (97%) rename src/test/java/coordinate/{geometricelement => }/LineTest.java (96%) rename src/test/java/coordinate/{CalculatorTest.java => PointMakerTest.java} (85%) rename src/test/java/coordinate/{geometricelement => }/RectangleTest.java (97%) rename src/test/java/coordinate/{geometricelement => }/TriangleTest.java (97%) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index cdf3e9b0..3069888d 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,7 +1,7 @@ -import coordinate.Calculator; -import coordinate.geometricelement.GeometricElement; -import coordinate.geometricelement.GeometricFactory; -import coordinate.geometricelement.Point; +import coordinate.PointMaker; +import coordinate.GeometricElement; +import coordinate.GeometricFactory; +import coordinate.Point; import util.Plate; import util.Terminal; @@ -10,7 +10,7 @@ public class Main { public static void main(String[] args) throws IOException { String in = Terminal.in("좌표를 입력하세요." + System.lineSeparator()); - Point[] points = Calculator.toPoints(in); + Point[] points = PointMaker.toPoints(in); Plate plate = new Plate(); plate.drawPoints(points); plate.print(); diff --git a/src/main/java/coordinate/geometricelement/GeometricElement.java b/src/main/java/coordinate/GeometricElement.java similarity index 72% rename from src/main/java/coordinate/geometricelement/GeometricElement.java rename to src/main/java/coordinate/GeometricElement.java index 04db3503..97f99772 100644 --- a/src/main/java/coordinate/geometricelement/GeometricElement.java +++ b/src/main/java/coordinate/GeometricElement.java @@ -1,4 +1,4 @@ -package coordinate.geometricelement; +package coordinate; public interface GeometricElement { double calculate(); diff --git a/src/main/java/coordinate/geometricelement/GeometricFactory.java b/src/main/java/coordinate/GeometricFactory.java similarity index 97% rename from src/main/java/coordinate/geometricelement/GeometricFactory.java rename to src/main/java/coordinate/GeometricFactory.java index 6bae53cd..e64c98c4 100644 --- a/src/main/java/coordinate/geometricelement/GeometricFactory.java +++ b/src/main/java/coordinate/GeometricFactory.java @@ -1,4 +1,4 @@ -package coordinate.geometricelement; +package coordinate; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; diff --git a/src/main/java/coordinate/geometricelement/Line.java b/src/main/java/coordinate/Line.java similarity index 95% rename from src/main/java/coordinate/geometricelement/Line.java rename to src/main/java/coordinate/Line.java index c43097a0..38a0a013 100644 --- a/src/main/java/coordinate/geometricelement/Line.java +++ b/src/main/java/coordinate/Line.java @@ -1,4 +1,4 @@ -package coordinate.geometricelement; +package coordinate; import util.Terminal; diff --git a/src/main/java/coordinate/geometricelement/Point.java b/src/main/java/coordinate/Point.java similarity index 94% rename from src/main/java/coordinate/geometricelement/Point.java rename to src/main/java/coordinate/Point.java index 6392153a..bc8de8e9 100644 --- a/src/main/java/coordinate/geometricelement/Point.java +++ b/src/main/java/coordinate/Point.java @@ -1,4 +1,4 @@ -package coordinate.geometricelement; +package coordinate; public class Point { private final int x; diff --git a/src/main/java/coordinate/Calculator.java b/src/main/java/coordinate/PointMaker.java similarity index 96% rename from src/main/java/coordinate/Calculator.java rename to src/main/java/coordinate/PointMaker.java index d98b1d91..13aac50f 100644 --- a/src/main/java/coordinate/Calculator.java +++ b/src/main/java/coordinate/PointMaker.java @@ -1,13 +1,11 @@ package coordinate; -import coordinate.geometricelement.Point; - import java.util.regex.Matcher; import java.util.regex.Pattern; import static exception.ExceptionMessage.*; -public class Calculator { +public class PointMaker { public static Point[] toPoints(String input) { if (isBlank(input)) { diff --git a/src/main/java/coordinate/geometricelement/Rectangle.java b/src/main/java/coordinate/Rectangle.java similarity index 98% rename from src/main/java/coordinate/geometricelement/Rectangle.java rename to src/main/java/coordinate/Rectangle.java index 192a7b34..c80a8fd0 100644 --- a/src/main/java/coordinate/geometricelement/Rectangle.java +++ b/src/main/java/coordinate/Rectangle.java @@ -1,4 +1,4 @@ -package coordinate.geometricelement; +package coordinate; import util.Terminal; diff --git a/src/main/java/coordinate/geometricelement/Shape.java b/src/main/java/coordinate/Shape.java similarity index 85% rename from src/main/java/coordinate/geometricelement/Shape.java rename to src/main/java/coordinate/Shape.java index 79731d34..a3e678ca 100644 --- a/src/main/java/coordinate/geometricelement/Shape.java +++ b/src/main/java/coordinate/Shape.java @@ -1,4 +1,4 @@ -package coordinate.geometricelement; +package coordinate; public abstract class Shape { diff --git a/src/main/java/coordinate/geometricelement/Triangle.java b/src/main/java/coordinate/Triangle.java similarity index 97% rename from src/main/java/coordinate/geometricelement/Triangle.java rename to src/main/java/coordinate/Triangle.java index dc103049..70967ffa 100644 --- a/src/main/java/coordinate/geometricelement/Triangle.java +++ b/src/main/java/coordinate/Triangle.java @@ -1,4 +1,4 @@ -package coordinate.geometricelement; +package coordinate; import util.Terminal; diff --git a/src/main/java/util/Plate.java b/src/main/java/util/Plate.java index f3088751..c7e813b4 100644 --- a/src/main/java/util/Plate.java +++ b/src/main/java/util/Plate.java @@ -1,6 +1,6 @@ package util; -import coordinate.geometricelement.Point; +import coordinate.Point; import java.util.Arrays; diff --git a/src/test/java/coordinate/geometricelement/GeometricElementFactoryTest.java b/src/test/java/coordinate/GeometricElementFactoryTest.java similarity index 97% rename from src/test/java/coordinate/geometricelement/GeometricElementFactoryTest.java rename to src/test/java/coordinate/GeometricElementFactoryTest.java index b074c1cc..438d7c13 100644 --- a/src/test/java/coordinate/geometricelement/GeometricElementFactoryTest.java +++ b/src/test/java/coordinate/GeometricElementFactoryTest.java @@ -1,4 +1,4 @@ -package coordinate.geometricelement; +package coordinate; import org.junit.jupiter.api.Test; diff --git a/src/test/java/coordinate/geometricelement/LineTest.java b/src/test/java/coordinate/LineTest.java similarity index 96% rename from src/test/java/coordinate/geometricelement/LineTest.java rename to src/test/java/coordinate/LineTest.java index ce2716ca..e3cfa5f6 100644 --- a/src/test/java/coordinate/geometricelement/LineTest.java +++ b/src/test/java/coordinate/LineTest.java @@ -1,4 +1,4 @@ -package coordinate.geometricelement; +package coordinate; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; diff --git a/src/test/java/coordinate/PointConverter.java b/src/test/java/coordinate/PointConverter.java index 4c6e7f64..3cb354ea 100644 --- a/src/test/java/coordinate/PointConverter.java +++ b/src/test/java/coordinate/PointConverter.java @@ -1,7 +1,5 @@ package coordinate; -import coordinate.geometricelement.Point; - import java.util.Arrays; public class PointConverter { diff --git a/src/test/java/coordinate/CalculatorTest.java b/src/test/java/coordinate/PointMakerTest.java similarity index 85% rename from src/test/java/coordinate/CalculatorTest.java rename to src/test/java/coordinate/PointMakerTest.java index 3f72fe39..f0b0035b 100644 --- a/src/test/java/coordinate/CalculatorTest.java +++ b/src/test/java/coordinate/PointMakerTest.java @@ -1,6 +1,5 @@ package coordinate; -import coordinate.geometricelement.Point; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -9,14 +8,14 @@ import static coordinate.PointConverter.getPoints; import static org.assertj.core.api.Assertions.assertThat; -public class CalculatorTest { +public class PointMakerTest { @ParameterizedTest @ValueSource(strings = {"(25,10)-(10,25)", "(0,13)-(23,0)", "(-1,17)-(8,-1)"}) void 좌표_입력_테스트_범위_초과(String input) { // when // then - IllegalArgumentException result = Assertions.assertThrows(IllegalArgumentException.class, () -> Calculator.toPoints(input)); + IllegalArgumentException result = Assertions.assertThrows(IllegalArgumentException.class, () -> PointMaker.toPoints(input)); assertThat(result.getMessage()).contains("input is from 1 to 24"); } @@ -26,7 +25,7 @@ public class CalculatorTest { void 좌표_입력_테스트_숫자가_아님(String input) { // when // then - ArithmeticException result = Assertions.assertThrows(ArithmeticException.class, () -> Calculator.toPoints(input)); + ArithmeticException result = Assertions.assertThrows(ArithmeticException.class, () -> PointMaker.toPoints(input)); assertThat(result.getMessage()).contains("The input is not a number"); } @@ -36,7 +35,7 @@ public class CalculatorTest { void 좌표_입력_테스트_공백_입력됨(String input) { // when // then - ArithmeticException result = Assertions.assertThrows(ArithmeticException.class, () -> Calculator.toPoints(input)); + ArithmeticException result = Assertions.assertThrows(ArithmeticException.class, () -> PointMaker.toPoints(input)); assertThat(result.getMessage()).contains("The input is not a two dimension point."); } @@ -52,7 +51,7 @@ public class CalculatorTest { Point[] points = getPoints(xStr, yStr); // when - Point[] result = Calculator.toPoints(input); + Point[] result = PointMaker.toPoints(input); // then assertThat(result).containsExactly(points); diff --git a/src/test/java/coordinate/geometricelement/RectangleTest.java b/src/test/java/coordinate/RectangleTest.java similarity index 97% rename from src/test/java/coordinate/geometricelement/RectangleTest.java rename to src/test/java/coordinate/RectangleTest.java index 12adc4cf..9ec60ef6 100644 --- a/src/test/java/coordinate/geometricelement/RectangleTest.java +++ b/src/test/java/coordinate/RectangleTest.java @@ -1,4 +1,4 @@ -package coordinate.geometricelement; +package coordinate; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; diff --git a/src/test/java/coordinate/geometricelement/TriangleTest.java b/src/test/java/coordinate/TriangleTest.java similarity index 97% rename from src/test/java/coordinate/geometricelement/TriangleTest.java rename to src/test/java/coordinate/TriangleTest.java index 5bb44b9c..e07408ba 100644 --- a/src/test/java/coordinate/geometricelement/TriangleTest.java +++ b/src/test/java/coordinate/TriangleTest.java @@ -1,4 +1,4 @@ -package coordinate.geometricelement; +package coordinate; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource;