From 1689cb091ad974a56cc03f75e5ed5ee9f3e49d62 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 11 Jul 2022 23:30:02 +0900 Subject: [PATCH 01/18] =?UTF-8?q?docs=20:=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 49 ++++++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 8fe71120..9607139b 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,37 @@ -## [NEXTSTEP 플레이그라운드의 미션 진행 과정](https://github.com/next-step/nextstep-docs/blob/master/playground/README.md) +# 좌표 계산기 ---- -## 학습 효과를 높이기 위해 추천하는 미션 진행 방법 +## 선 길이 ---- -1. 피드백 강의 전까지 미션 진행 -> 피드백 강의 전까지 혼자 힘으로 미션 진행. 미션을 진행하면서 하나의 작업이 끝날 때 마다 add, commit -> 예를 들어 다음 숫자 야구 게임의 경우 0, 1, 2단계까지 구현을 완료한 후 push +### 기능 요구사항 -![mission baseball](https://raw.githubusercontent.com/next-step/nextstep-docs/master/playground/images/mission_baseball.png) +- 사용자가 점에 대한 좌표 정보를 입력하는 메뉴를 구성한다. +- 좌표 정보는 괄호"(", ")"로 둘러쌓여 있으며 쉼표(,)로 x값과 y값을 구분한다. +- X, Y좌표 모두 최대 24까지만 입력할 수 있다. +- 입력 범위를 초과할 경우 에러 문구를 출력하고 다시 입력을 받는다. +- 정상적인 좌표값을 입력한 경우, 해당 좌표에 특수문자를 표시한다. +- 좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. +- 직선인 경우는 두 점 사이 거리를 계산해서 출력한다. ---- -2. 피드백 앞 단계까지 미션 구현을 완료한 후 피드백 강의를 학습한다. +### 이벤트 ---- -3. Git 브랜치를 master 또는 main으로 변경한 후 피드백을 반영하기 위한 새로운 브랜치를 생성한 후 처음부터 다시 미션 구현을 도전한다. +1. 사용자가 식을 입력했다. +2. 식이 계산됐다. -``` -git branch -a // 모든 로컬 브랜치 확인 -git checkout master // 기본 브랜치가 master인 경우 -git checkout main // 기본 브랜치가 main인 경우 -git checkout -b 브랜치이름 -ex) git checkout -b apply-feedback -``` +### 모델링 + +- 좌표 + - 행위 + - 좌표 두 개를 입력 받아 표를 그린다. + - 표를 그린다. + - 표에 점을 찍는다. + - 표를 출력한다. +- 계산 + - 행위 + - 식을 입력받는다. + - 식의 유효성 검사를 진행한다.(식은 괄호"(", ")"로 둘러쌓여 있으며 쉼표(,)로 좌표를 구분한다.) + - 식에서 좌표 두 개를 추출한다. + - 좌표의 유효성 검사를 진행한다.(좌표는 0이상 24이하의 자연수이다.) + - 좌표 두 개를 표에 찍는다. + - 식을 계산한다. + - 좌 표 두 개의 직선상의 거리를 계산한다. From 4a24249dac72644421a62ff9fe15f24b64a65f8a Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 11 Jul 2022 23:30:02 +0900 Subject: [PATCH 02/18] =?UTF-8?q?docs=20:=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 58 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 8fe71120..ab7441db 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,46 @@ -## [NEXTSTEP 플레이그라운드의 미션 진행 과정](https://github.com/next-step/nextstep-docs/blob/master/playground/README.md) +# 좌표 계산기 ---- -## 학습 효과를 높이기 위해 추천하는 미션 진행 방법 +## 선 길이 ---- -1. 피드백 강의 전까지 미션 진행 -> 피드백 강의 전까지 혼자 힘으로 미션 진행. 미션을 진행하면서 하나의 작업이 끝날 때 마다 add, commit -> 예를 들어 다음 숫자 야구 게임의 경우 0, 1, 2단계까지 구현을 완료한 후 push +### 기능 요구사항 -![mission baseball](https://raw.githubusercontent.com/next-step/nextstep-docs/master/playground/images/mission_baseball.png) +- 사용자가 점에 대한 좌표 정보를 입력하는 메뉴를 구성한다. +- 좌표 정보는 괄호"(", ")"로 둘러쌓여 있으며 쉼표(,)로 x값과 y값을 구분한다. +- X, Y좌표 모두 최대 24까지만 입력할 수 있다. +- 입력 범위를 초과할 경우 에러 문구를 출력하고 다시 입력을 받는다. +- 정상적인 좌표값을 입력한 경우, 해당 좌표에 특수문자를 표시한다. +- 좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. +- 직선인 경우는 두 점 사이 거리를 계산해서 출력한다. ---- -2. 피드백 앞 단계까지 미션 구현을 완료한 후 피드백 강의를 학습한다. +### 이벤트 ---- -3. Git 브랜치를 master 또는 main으로 변경한 후 피드백을 반영하기 위한 새로운 브랜치를 생성한 후 처음부터 다시 미션 구현을 도전한다. +1. 사용자가 식을 입력했다. +2. 식이 계산됐다. -``` -git branch -a // 모든 로컬 브랜치 확인 -git checkout master // 기본 브랜치가 master인 경우 -git checkout main // 기본 브랜치가 main인 경우 -git checkout -b 브랜치이름 -ex) git checkout -b apply-feedback -``` +### 모델링 + +- 선 길이 계산기 + - 행위 + - 식을 입력 받아 좌표 그래프에 그리고 직선상의 거리를 계산한다. +- 좌표 + - 상태 + - x값과 y값을 가진다. + - 좌표는 0이상 24이하의 자연수이다. + - 행위 + - 좌표를 입력받으면 직선상의 거리를 계산한다. +- 좌표 그래프 + - 행위 + - 좌표 두 개를 입력 받아 표를 그린다. + - 표를 그린다. + - 표에 점을 찍는다. + - 표를 출력한다. +- 식 + - 상태 + - 두 개의 좌표 정보를 가지고 있다. + - 행위 + - 식을 입력받는다. + - 식의 유효성 검사를 진행한다.(식은 괄호"(", ")"로 둘러쌓여 있으며 쉼표(,)로 좌표를 구분한다.) + - 식에서 좌표 두 개를 추출한다. + - 좌표 두 개를 표에 찍는다. + - 식을 계산한다. From 2ac06a62a9882a208467b9fcffc122cca2ecf002 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Tue, 12 Jul 2022 00:39:53 +0900 Subject: [PATCH 03/18] =?UTF-8?q?feat=20:=20StringExpression=20TDD?= =?UTF-8?q?=EB=A1=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/coordinate/StringExpression.java | 32 ++++++++++ .../java/coordinate/StringExpressionTest.java | 61 +++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 src/main/java/coordinate/StringExpression.java create mode 100644 src/test/java/coordinate/StringExpressionTest.java diff --git a/src/main/java/coordinate/StringExpression.java b/src/main/java/coordinate/StringExpression.java new file mode 100644 index 00000000..44fc6b92 --- /dev/null +++ b/src/main/java/coordinate/StringExpression.java @@ -0,0 +1,32 @@ +package coordinate; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class StringExpression { + private static final String X_1 = "x1"; + private static final String Y_1 = "y1"; + private static final String X_2 = "x2"; + private static final String Y_2 = "y2"; + private final static Pattern PATTERN = Pattern + .compile("\\((?<" + X_1 + ">\\d+),(?<" + Y_1 + ">\\d+)\\)-\\((?<" + X_2 + ">\\d+),(?<" + Y_2 + ">\\d+)\\)"); + private final Coordinate firstCoordinate; + private final Coordinate secondCoordinate; + + public StringExpression(String expression) { + Matcher matcher = PATTERN.matcher(expression); + if (!matcher.matches()) { + throw new IllegalArgumentException(); + } + firstCoordinate = new Coordinate(X_1, Y_1); + secondCoordinate = new Coordinate(X_2, Y_2); + } + + public Coordinate getFirstCoordinate() { + return firstCoordinate; + } + + public Coordinate getSecondCoordinate() { + return secondCoordinate; + } +} diff --git a/src/test/java/coordinate/StringExpressionTest.java b/src/test/java/coordinate/StringExpressionTest.java new file mode 100644 index 00000000..f3d2fb3d --- /dev/null +++ b/src/test/java/coordinate/StringExpressionTest.java @@ -0,0 +1,61 @@ +package coordinate; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.*; + +class StringExpressionTest { + + private static final String 입력값 = "(10,10)-(14,15)"; + + @Test + @DisplayName("식을 입력받는다.") + void test1() { + //when & then + assertDoesNotThrow( + () -> new StringExpression(입력값) + ); + } + + @Test + @DisplayName("식은 괄호\"(\", \")\"로 둘러쌓여 있으며 쉼표(,)로 좌표를 구분한다.") + void test2() { + //given + String stringExpression = 입력값; + + //when & then + assertDoesNotThrow( + () -> new StringExpression(stringExpression) + ); + } + + @Test + @DisplayName("식이 포멧에 맞지 않으면 예외가 발생한다.") + void test3() { + //given + String 실패되는_입력_값 = "10, 12"; + + //when & then + assertThatThrownBy( + () -> new StringExpression(실패되는_입력_값) + ).isInstanceOf(IllegalArgumentException.class); + } + + + @Test + @DisplayName("식에서 좌표 두 개를 추출한다.") + void test4() { + // given + String stringExpression = 입력값; + + // when + StringExpression expression = new StringExpression(stringExpression); + + // then + assertThat(expression.getFirstCoordinate()).isNotNull(); + assertThat(expression.getSecondCoordinate()).isNotNull(); + } +} From fe1e84d768e54ada6623a07474141336b77977b3 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Tue, 12 Jul 2022 00:41:06 +0900 Subject: [PATCH 04/18] =?UTF-8?q?docs=20:=20=EB=AA=A8=EB=8D=B8=EB=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index ab7441db..3c415373 100644 --- a/README.md +++ b/README.md @@ -42,5 +42,4 @@ - 식을 입력받는다. - 식의 유효성 검사를 진행한다.(식은 괄호"(", ")"로 둘러쌓여 있으며 쉼표(,)로 좌표를 구분한다.) - 식에서 좌표 두 개를 추출한다. - - 좌표 두 개를 표에 찍는다. - - 식을 계산한다. + - 식을 계산한다. From d1a0e1cc621078ce4b884585829b529f88697be3 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Tue, 12 Jul 2022 00:53:42 +0900 Subject: [PATCH 05/18] =?UTF-8?q?feat=20:=20Coordinate=20TDD=EB=A1=9C=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/Coordinate.java | 23 ++++++++ .../java/coordinate/StringExpression.java | 11 +++- src/test/java/coordinate/CoordinateTest.java | 59 +++++++++++++++++++ 3 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 src/main/java/coordinate/Coordinate.java create mode 100644 src/test/java/coordinate/CoordinateTest.java diff --git a/src/main/java/coordinate/Coordinate.java b/src/main/java/coordinate/Coordinate.java new file mode 100644 index 00000000..b74f6145 --- /dev/null +++ b/src/main/java/coordinate/Coordinate.java @@ -0,0 +1,23 @@ +package coordinate; + +public class Coordinate { + private final double x; + private final double y; + + public Coordinate(String stringX, String stringY) { + + try { + if (1.0 > Double.parseDouble(stringX) || Double.parseDouble(stringX) > 24.0) { + throw new IllegalArgumentException(); + } + if (1.0 > Double.parseDouble(stringY) || Double.parseDouble(stringY) > 24.0) { + throw new IllegalArgumentException(); + } + } catch (NumberFormatException e) { + throw new IllegalArgumentException(); + } + + x = Double.parseDouble(stringX); + y = Double.parseDouble(stringY); + } +} diff --git a/src/main/java/coordinate/StringExpression.java b/src/main/java/coordinate/StringExpression.java index 44fc6b92..13766936 100644 --- a/src/main/java/coordinate/StringExpression.java +++ b/src/main/java/coordinate/StringExpression.java @@ -1,5 +1,7 @@ package coordinate; +import org.jetbrains.annotations.NotNull; + import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -18,8 +20,8 @@ public StringExpression(String expression) { if (!matcher.matches()) { throw new IllegalArgumentException(); } - firstCoordinate = new Coordinate(X_1, Y_1); - secondCoordinate = new Coordinate(X_2, Y_2); + firstCoordinate = getCoordinate(matcher, X_1, Y_1); + secondCoordinate = getCoordinate(matcher, X_2, Y_2); } public Coordinate getFirstCoordinate() { @@ -29,4 +31,9 @@ public Coordinate getFirstCoordinate() { public Coordinate getSecondCoordinate() { return secondCoordinate; } + + @NotNull + private Coordinate getCoordinate(Matcher matcher, String x1, String y1) { + return new Coordinate(matcher.group(x1), matcher.group(y1)); + } } diff --git a/src/test/java/coordinate/CoordinateTest.java b/src/test/java/coordinate/CoordinateTest.java new file mode 100644 index 00000000..6cf1b72e --- /dev/null +++ b/src/test/java/coordinate/CoordinateTest.java @@ -0,0 +1,59 @@ +package coordinate; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +class CoordinateTest { + + @Test + @DisplayName("x, y 값을 입력해 좌표를 생성한다.") + void test1() { + //when & then + assertDoesNotThrow( + () -> new Coordinate("1", "4") + ); + } + + @Test + @DisplayName("좌표는 음수이면 IllegalArgumentException 예외가 발생한다.") + void test2() { + // given + String x = "-1"; + String y = "1"; + + //when & then + Assertions.assertThatThrownBy( + () -> new Coordinate(x, y) + ).isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("좌표는 25이상이면 IllegalArgumentException 예외가 발생한다.") + void test3() { + // given + String x = "25"; + String y = "1"; + + //when & then + Assertions.assertThatThrownBy( + () -> new Coordinate(x, y) + ).isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("좌표에 입력 값에 숫자가 아닌 문자가 들어가면 IllegalArgumentException 예외가 발생한다.") + void test4() { + // given + String x = "test"; + String y = "1"; + + //when & then + Assertions.assertThatThrownBy( + () -> new Coordinate(x, y) + ).isInstanceOf(IllegalArgumentException.class); + } + +} From af55d2190e9d8efb4c6c3c1e8441468efb3f7625 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Tue, 12 Jul 2022 22:16:00 +0900 Subject: [PATCH 06/18] =?UTF-8?q?refact=20:=20=EC=8B=9D=EC=9D=84=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + src/main/java/coordinate/Coordinate.java | 10 ++++++++++ src/main/java/coordinate/StringExpression.java | 4 ++++ src/test/java/coordinate/CoordinateTest.java | 13 +++++++++++++ src/test/java/coordinate/StringExpressionTest.java | 11 +++++++++++ 5 files changed, 39 insertions(+) diff --git a/README.md b/README.md index 3c415373..b545dec0 100644 --- a/README.md +++ b/README.md @@ -43,3 +43,4 @@ - 식의 유효성 검사를 진행한다.(식은 괄호"(", ")"로 둘러쌓여 있으며 쉼표(,)로 좌표를 구분한다.) - 식에서 좌표 두 개를 추출한다. - 식을 계산한다. + - 자신의 위치와 입력받는 위치의 직선 상의 거리를 계산한다. diff --git a/src/main/java/coordinate/Coordinate.java b/src/main/java/coordinate/Coordinate.java index b74f6145..9aa2f080 100644 --- a/src/main/java/coordinate/Coordinate.java +++ b/src/main/java/coordinate/Coordinate.java @@ -1,5 +1,7 @@ package coordinate; +import static java.lang.Math.abs; + public class Coordinate { private final double x; private final double y; @@ -20,4 +22,12 @@ public Coordinate(String stringX, String stringY) { x = Double.parseDouble(stringX); y = Double.parseDouble(stringY); } + + public double getDistance(Coordinate secondCoordinate) { + return Math.sqrt( + abs( + (x - secondCoordinate.x) * (x - secondCoordinate.x) + - (y - secondCoordinate.y) * (y - secondCoordinate.y)) + ); + } } diff --git a/src/main/java/coordinate/StringExpression.java b/src/main/java/coordinate/StringExpression.java index 13766936..535ea1f8 100644 --- a/src/main/java/coordinate/StringExpression.java +++ b/src/main/java/coordinate/StringExpression.java @@ -36,4 +36,8 @@ public Coordinate getSecondCoordinate() { private Coordinate getCoordinate(Matcher matcher, String x1, String y1) { return new Coordinate(matcher.group(x1), matcher.group(y1)); } + + public double getDistance() { + return firstCoordinate.getDistance(secondCoordinate); + } } diff --git a/src/test/java/coordinate/CoordinateTest.java b/src/test/java/coordinate/CoordinateTest.java index 6cf1b72e..5437bb5e 100644 --- a/src/test/java/coordinate/CoordinateTest.java +++ b/src/test/java/coordinate/CoordinateTest.java @@ -5,6 +5,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; class CoordinateTest { @@ -56,4 +57,16 @@ void test4() { ).isInstanceOf(IllegalArgumentException.class); } + private static final String 입력값 = "(10,10)-(14,15)"; + + @Test + @DisplayName("자신의 위치와 입력받는 위치의 직선 상의 거리를 계산한다.") + void test5() { + //given + Coordinate 자신 = new Coordinate("10", "10"); + Coordinate 입력값 = new Coordinate("14", "15"); + + //when & then + assertEquals(3.0, 자신.getDistance(입력값), 0.1); + } } diff --git a/src/test/java/coordinate/StringExpressionTest.java b/src/test/java/coordinate/StringExpressionTest.java index f3d2fb3d..23ff7dfe 100644 --- a/src/test/java/coordinate/StringExpressionTest.java +++ b/src/test/java/coordinate/StringExpressionTest.java @@ -58,4 +58,15 @@ void test4() { assertThat(expression.getFirstCoordinate()).isNotNull(); assertThat(expression.getSecondCoordinate()).isNotNull(); } + + @Test + @DisplayName("식을 계산한다.") + void test5() { + // given + String stringExpression = 입력값; + // when + StringExpression expression = new StringExpression(stringExpression); + // then + assertEquals(3.0, expression.getDistance(), 0.1); + } } From edcde572f3f0f7f05e44fa71ac4ec155a8aa942a Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Tue, 12 Jul 2022 22:32:35 +0900 Subject: [PATCH 07/18] =?UTF-8?q?feat=20:=20LineCalculator=20=08TDD?= =?UTF-8?q?=EB=A1=9C=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/CoordinateMain.java | 26 ++++++++++ .../coordinate/{ => domain}/Coordinate.java | 2 +- .../domain/CoordinateGraphClient.java | 5 ++ .../domain/CoordinateInputClient.java | 5 ++ .../coordinate/domain/LineCalculator.java | 25 ++++++++++ .../{ => domain}/StringExpression.java | 3 +- .../{ => domain}/CoordinateTest.java | 3 +- .../coordinate/domain/LineCalculatorTest.java | 50 +++++++++++++++++++ .../{ => domain}/StringExpressionTest.java | 3 +- .../fake/FakeCoordinateGraphClient.java | 11 ++++ .../fake/FakeCoordinateInputClient.java | 10 ++++ 11 files changed, 139 insertions(+), 4 deletions(-) create mode 100644 src/main/java/coordinate/CoordinateMain.java rename src/main/java/coordinate/{ => domain}/Coordinate.java (97%) create mode 100644 src/main/java/coordinate/domain/CoordinateGraphClient.java create mode 100644 src/main/java/coordinate/domain/CoordinateInputClient.java create mode 100644 src/main/java/coordinate/domain/LineCalculator.java rename src/main/java/coordinate/{ => domain}/StringExpression.java (95%) rename src/test/java/coordinate/{ => domain}/CoordinateTest.java (96%) create mode 100644 src/test/java/coordinate/domain/LineCalculatorTest.java rename src/test/java/coordinate/{ => domain}/StringExpressionTest.java (96%) create mode 100644 src/test/java/coordinate/fake/FakeCoordinateGraphClient.java create mode 100644 src/test/java/coordinate/fake/FakeCoordinateInputClient.java diff --git a/src/main/java/coordinate/CoordinateMain.java b/src/main/java/coordinate/CoordinateMain.java new file mode 100644 index 00000000..030a3de0 --- /dev/null +++ b/src/main/java/coordinate/CoordinateMain.java @@ -0,0 +1,26 @@ +package coordinate; + +import coordinate.domain.LineCalculator; +import coordinate.domain.StringExpression; +import coordinate.infra.CoordinateGraphClient; +import coordinate.infra.CoordinateInputClient; + +public class CoordinateMain { + + public static void main(String[] args) { + coordinate.domain.CoordinateInputClient coordinateInputClient = new CoordinateInputClient(); + coordinate.domain.CoordinateGraphClient coordinateGraphClient = new CoordinateGraphClient(); + + LineCalculator lineCalculator = new LineCalculator(coordinateGraphClient, coordinateInputClient); + + //input + StringExpression expression = lineCalculator.input(); + + //display + lineCalculator.display(expression); + + //calculate + double value = lineCalculator.calculate(expression); + System.out.println(value); + } +} diff --git a/src/main/java/coordinate/Coordinate.java b/src/main/java/coordinate/domain/Coordinate.java similarity index 97% rename from src/main/java/coordinate/Coordinate.java rename to src/main/java/coordinate/domain/Coordinate.java index 9aa2f080..116cf1e3 100644 --- a/src/main/java/coordinate/Coordinate.java +++ b/src/main/java/coordinate/domain/Coordinate.java @@ -1,4 +1,4 @@ -package coordinate; +package coordinate.domain; import static java.lang.Math.abs; diff --git a/src/main/java/coordinate/domain/CoordinateGraphClient.java b/src/main/java/coordinate/domain/CoordinateGraphClient.java new file mode 100644 index 00000000..0cfc3970 --- /dev/null +++ b/src/main/java/coordinate/domain/CoordinateGraphClient.java @@ -0,0 +1,5 @@ +package coordinate.domain; + +public interface CoordinateGraphClient { + boolean displayGraph(Coordinate firstCoordinate, Coordinate secondCoordinate); +} diff --git a/src/main/java/coordinate/domain/CoordinateInputClient.java b/src/main/java/coordinate/domain/CoordinateInputClient.java new file mode 100644 index 00000000..862ad363 --- /dev/null +++ b/src/main/java/coordinate/domain/CoordinateInputClient.java @@ -0,0 +1,5 @@ +package coordinate.domain; + +public interface CoordinateInputClient { + String inputString(); +} diff --git a/src/main/java/coordinate/domain/LineCalculator.java b/src/main/java/coordinate/domain/LineCalculator.java new file mode 100644 index 00000000..fb198f9f --- /dev/null +++ b/src/main/java/coordinate/domain/LineCalculator.java @@ -0,0 +1,25 @@ +package coordinate.domain; + +public class LineCalculator { + + private final CoordinateGraphClient coordinateGraphClient; + private final CoordinateInputClient coordinateInputClient; + + public LineCalculator(CoordinateGraphClient coordinateGraphClient, CoordinateInputClient coordinateInputClient) { + this.coordinateGraphClient = coordinateGraphClient; + this.coordinateInputClient = coordinateInputClient; + } + + public StringExpression input() { + String stringExpression = coordinateInputClient.inputString(); + return new StringExpression(stringExpression); + } + + public double calculate(StringExpression expression) { + return expression.getDistance(); + } + + public boolean display(StringExpression expression) { + return coordinateGraphClient.displayGraph(expression.getFirstCoordinate(), expression.getSecondCoordinate()); + } +} diff --git a/src/main/java/coordinate/StringExpression.java b/src/main/java/coordinate/domain/StringExpression.java similarity index 95% rename from src/main/java/coordinate/StringExpression.java rename to src/main/java/coordinate/domain/StringExpression.java index 535ea1f8..0e4a271d 100644 --- a/src/main/java/coordinate/StringExpression.java +++ b/src/main/java/coordinate/domain/StringExpression.java @@ -1,5 +1,6 @@ -package coordinate; +package coordinate.domain; +import coordinate.domain.Coordinate; import org.jetbrains.annotations.NotNull; import java.util.regex.Matcher; diff --git a/src/test/java/coordinate/CoordinateTest.java b/src/test/java/coordinate/domain/CoordinateTest.java similarity index 96% rename from src/test/java/coordinate/CoordinateTest.java rename to src/test/java/coordinate/domain/CoordinateTest.java index 5437bb5e..c0f91372 100644 --- a/src/test/java/coordinate/CoordinateTest.java +++ b/src/test/java/coordinate/domain/CoordinateTest.java @@ -1,5 +1,6 @@ -package coordinate; +package coordinate.domain; +import coordinate.domain.Coordinate; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/coordinate/domain/LineCalculatorTest.java b/src/test/java/coordinate/domain/LineCalculatorTest.java new file mode 100644 index 00000000..039a6b6c --- /dev/null +++ b/src/test/java/coordinate/domain/LineCalculatorTest.java @@ -0,0 +1,50 @@ +package coordinate.domain; + +import coordinate.fake.FakeCoordinateGraphClient; +import coordinate.fake.FakeCoordinateInputClient; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class LineCalculatorTest { + + private FakeCoordinateGraphClient fakeCoordinateGraphClient = new FakeCoordinateGraphClient(); + private FakeCoordinateInputClient fakeCoordinateInputClient = new FakeCoordinateInputClient(); + private LineCalculator lineCalculator; + + @BeforeEach + void setUp() { + lineCalculator = new LineCalculator(fakeCoordinateGraphClient, fakeCoordinateInputClient); + } + + @Test + @DisplayName("좌표 두 개를 표에 찍는다.") + void test6() { + //given + StringExpression expression = lineCalculator.input(); + + //when + boolean isDisplayed = lineCalculator.display(expression); + + //then + assertTrue(isDisplayed); + } + + @Test + @DisplayName("좌 표 두 개의 직선상의 거리를 계산한다.") + void test8() { + //given + StringExpression expression = lineCalculator.input(); + double expected = 3.0; + + //when + double actual = lineCalculator.calculate(expression); + + //then + assertEquals(expected, actual, 0.1); + } + +} diff --git a/src/test/java/coordinate/StringExpressionTest.java b/src/test/java/coordinate/domain/StringExpressionTest.java similarity index 96% rename from src/test/java/coordinate/StringExpressionTest.java rename to src/test/java/coordinate/domain/StringExpressionTest.java index 23ff7dfe..7d79da0a 100644 --- a/src/test/java/coordinate/StringExpressionTest.java +++ b/src/test/java/coordinate/domain/StringExpressionTest.java @@ -1,5 +1,6 @@ -package coordinate; +package coordinate.domain; +import coordinate.domain.StringExpression; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/coordinate/fake/FakeCoordinateGraphClient.java b/src/test/java/coordinate/fake/FakeCoordinateGraphClient.java new file mode 100644 index 00000000..ec8d7728 --- /dev/null +++ b/src/test/java/coordinate/fake/FakeCoordinateGraphClient.java @@ -0,0 +1,11 @@ +package coordinate.fake; + +import coordinate.domain.Coordinate; +import coordinate.domain.CoordinateGraphClient; + +public class FakeCoordinateGraphClient implements CoordinateGraphClient { + @Override + public boolean displayGraph(Coordinate firstCoordinate, Coordinate secondCoordinate) { + return firstCoordinate.getDistance(secondCoordinate) < 5; + } +} diff --git a/src/test/java/coordinate/fake/FakeCoordinateInputClient.java b/src/test/java/coordinate/fake/FakeCoordinateInputClient.java new file mode 100644 index 00000000..bd40b5f7 --- /dev/null +++ b/src/test/java/coordinate/fake/FakeCoordinateInputClient.java @@ -0,0 +1,10 @@ +package coordinate.fake; + +import coordinate.domain.CoordinateInputClient; + +public class FakeCoordinateInputClient implements CoordinateInputClient { + @Override + public String inputString() { + return "(10,10)-(14,15)"; + } +} From 27b82600eb622d9485063ee83061aa80b51f5cc9 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 18 Jul 2022 21:01:16 +0900 Subject: [PATCH 08/18] =?UTF-8?q?docs=20:=20=EC=88=98=EC=A0=95=EB=90=9C=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/README.md b/README.md index 8d6b3cdc..f1140e87 100644 --- a/README.md +++ b/README.md @@ -35,3 +35,55 @@ - 표를 그린다. - 표에 점을 찍는다. - 표를 출력한다. + + +### 추가된 요구사항 + +- 좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. +- 좌표값을 네 개 입력한 경우, 네 점을 연결하는 사각형으로 가정한다. +- 네 점이 뒤틀어진 사다리꼴이나 마름모는 제외하고 직사각형만 허용하도록 검사한다. +- 사각형인 경우 사각형의 넓이를 계산해서 출력한다. + +- 좌표계산기 + - 행위 + - 입력을 받습니다. + - 입력이 선 인지 직사각형인지 판단합니다. + - 선인 경우 선의 길이를 계산합니다. + - 직사각형인 경우 직사각형의 넓이를 계산합니다. + - 답을 출력합니다. + - 도형의 답을 출력합니다. + - 좌표를 출력합니다. + - 도형에게 좌표를 가져와 좌표그래프에 답을 출력합니다. +- 도형 + - 행위 + - 답을 출력합니다. + - 좌표를 출력합니다. +- 선 + - 상태 + - 좌표 두 개를 가지고 있습니다. + - 행위 + - 답을 출력합니다. + - 답은 길이입니다. + - 좌표를 출력합니다. +- 직사각형 + - 상태 + - 좌표 네 개를 가지고 있습니다. + - 네 점이 뒤틀어진 사다리꼴이나 마름모가 아닌 직사각형만 됩니다. + - 행위 + - 답을 출력합니다. + - 넓이를 계산합니다. + - 좌표를 출력합니다. +- 좌표 그래프 + - 행위 + - 좌표 두 개를 입력 받아 표를 그립니다. + - 표를 그립니다. + - 표에 점을 찍습니다. + - 표를 출력합니다. +- 좌표 + - 상태 + - x값과 y값을 가집니다. + - 좌표는 0이상 24이하의 자연수입니다. + - 행위 + - 좌표를 입력받습니다. + - 입력되는 식은 정규 표현식에 맞아야 합니다. + - 입력되는 좌표는 숫자가 들어가야 합니다. From 26a023235b434ee8f8d3170aea25dbbc4ad31883 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 18 Jul 2022 21:05:10 +0900 Subject: [PATCH 09/18] =?UTF-8?q?Refact=20:=20Line,=20Rectangle,=20Coordin?= =?UTF-8?q?ate=20=EA=B0=9D=EC=B2=B4=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/CoordinateMain.java | 31 +++++--- .../java/coordinate/domain/Coordinate.java | 59 ++++++++++---- .../domain/CoordinateGraphClient.java | 4 +- .../domain/CoordinatesCalculator.java | 4 + src/main/java/coordinate/domain/Line.java | 49 ++++++++++++ .../coordinate/domain/LineCalculator.java | 25 ------ .../java/coordinate/domain/Rectangle.java | 63 +++++++++++++++ src/main/java/coordinate/domain/Shapes.java | 9 +++ .../coordinate/domain/StringExpression.java | 44 ----------- .../coordinate/domain/CoordinateTest.java | 76 ++++++++----------- .../coordinate/domain/LineCalculatorTest.java | 50 ------------ src/test/java/coordinate/domain/LineTest.java | 62 +++++++++++++++ .../java/coordinate/domain/RectangleTest.java | 57 ++++++++++++++ .../domain/StringExpressionTest.java | 73 ------------------ .../fake/FakeCoordinateGraphClient.java | 11 --- .../fake/FakeCoordinateInputClient.java | 10 --- 16 files changed, 340 insertions(+), 287 deletions(-) create mode 100644 src/main/java/coordinate/domain/CoordinatesCalculator.java create mode 100644 src/main/java/coordinate/domain/Line.java delete mode 100644 src/main/java/coordinate/domain/LineCalculator.java create mode 100644 src/main/java/coordinate/domain/Rectangle.java create mode 100644 src/main/java/coordinate/domain/Shapes.java delete mode 100644 src/main/java/coordinate/domain/StringExpression.java delete mode 100644 src/test/java/coordinate/domain/LineCalculatorTest.java create mode 100644 src/test/java/coordinate/domain/LineTest.java create mode 100644 src/test/java/coordinate/domain/RectangleTest.java delete mode 100644 src/test/java/coordinate/domain/StringExpressionTest.java delete mode 100644 src/test/java/coordinate/fake/FakeCoordinateGraphClient.java delete mode 100644 src/test/java/coordinate/fake/FakeCoordinateInputClient.java diff --git a/src/main/java/coordinate/CoordinateMain.java b/src/main/java/coordinate/CoordinateMain.java index 030a3de0..2180cacd 100644 --- a/src/main/java/coordinate/CoordinateMain.java +++ b/src/main/java/coordinate/CoordinateMain.java @@ -1,26 +1,35 @@ package coordinate; -import coordinate.domain.LineCalculator; -import coordinate.domain.StringExpression; -import coordinate.infra.CoordinateGraphClient; -import coordinate.infra.CoordinateInputClient; +import coordinate.domain.*; + +import java.util.List; public class CoordinateMain { public static void main(String[] args) { - coordinate.domain.CoordinateInputClient coordinateInputClient = new CoordinateInputClient(); - coordinate.domain.CoordinateGraphClient coordinateGraphClient = new CoordinateGraphClient(); + coordinate.domain.CoordinateInputClient coordinateInputClient = new CoordinateInputClient() { + @Override + public String inputString() { + return "(10,10)-(14,15)"; + } + }; + coordinate.domain.CoordinateGraphClient coordinateGraphClient = new CoordinateGraphClient() { + @Override + public boolean displayGraph(List coordinates) { + return true; + } + }; - LineCalculator lineCalculator = new LineCalculator(coordinateGraphClient, coordinateInputClient); +// LineCalculator lineCalculator = new LineCalculator(coordinateGraphClient, coordinateInputClient); //input - StringExpression expression = lineCalculator.input(); +// Line expression = lineCalculator.input(); //display - lineCalculator.display(expression); +// lineCalculator.display(expression); //calculate - double value = lineCalculator.calculate(expression); - System.out.println(value); +// double value = lineCalculator.calculate(expression); +// System.out.println(value); } } diff --git a/src/main/java/coordinate/domain/Coordinate.java b/src/main/java/coordinate/domain/Coordinate.java index 116cf1e3..be9cf74a 100644 --- a/src/main/java/coordinate/domain/Coordinate.java +++ b/src/main/java/coordinate/domain/Coordinate.java @@ -1,33 +1,60 @@ package coordinate.domain; -import static java.lang.Math.abs; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class Coordinate { private final double x; private final double y; - public Coordinate(String stringX, String stringY) { + private static final String X = "x"; + private static final String Y = "y"; - try { - if (1.0 > Double.parseDouble(stringX) || Double.parseDouble(stringX) > 24.0) { - throw new IllegalArgumentException(); - } - if (1.0 > Double.parseDouble(stringY) || Double.parseDouble(stringY) > 24.0) { - throw new IllegalArgumentException(); - } - } catch (NumberFormatException e) { + private final static Pattern PATTERN = Pattern + .compile("\\((?<" + X + ">\\d+),(?<" + Y + ">\\d+)\\)"); + + + public Coordinate(String expression) { + Matcher matcher = PATTERN.matcher(expression); + if (!matcher.matches()) { + throw new IllegalArgumentException(); + } + + String stringX = matcher.group(X); + String stringY = matcher.group(Y); + + isNumber(stringX); + isNumber(stringY); + + if (validationNumber(stringX)) { + throw new IllegalArgumentException(); + } + if (validationNumber(stringY)) { throw new IllegalArgumentException(); } x = Double.parseDouble(stringX); y = Double.parseDouble(stringY); + + } + + private boolean validationNumber(String number) { + return 1.0 > Double.parseDouble(number) || Double.parseDouble(number) > 24.0; + } + + private void isNumber(String stringX) { + try { + Double.parseDouble(stringX); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(); + } + } + + public double getX() { + return x; } - public double getDistance(Coordinate secondCoordinate) { - return Math.sqrt( - abs( - (x - secondCoordinate.x) * (x - secondCoordinate.x) - - (y - secondCoordinate.y) * (y - secondCoordinate.y)) - ); + public double getY() { + return y; } } diff --git a/src/main/java/coordinate/domain/CoordinateGraphClient.java b/src/main/java/coordinate/domain/CoordinateGraphClient.java index 0cfc3970..ee279923 100644 --- a/src/main/java/coordinate/domain/CoordinateGraphClient.java +++ b/src/main/java/coordinate/domain/CoordinateGraphClient.java @@ -1,5 +1,7 @@ package coordinate.domain; +import java.util.List; + public interface CoordinateGraphClient { - boolean displayGraph(Coordinate firstCoordinate, Coordinate secondCoordinate); + boolean displayGraph(List coordinates); } diff --git a/src/main/java/coordinate/domain/CoordinatesCalculator.java b/src/main/java/coordinate/domain/CoordinatesCalculator.java new file mode 100644 index 00000000..ac9ce0df --- /dev/null +++ b/src/main/java/coordinate/domain/CoordinatesCalculator.java @@ -0,0 +1,4 @@ +package coordinate.domain; + +public class CoordinatesCalculator { +} diff --git a/src/main/java/coordinate/domain/Line.java b/src/main/java/coordinate/domain/Line.java new file mode 100644 index 00000000..e4dc5ff4 --- /dev/null +++ b/src/main/java/coordinate/domain/Line.java @@ -0,0 +1,49 @@ +package coordinate.domain; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static java.lang.Math.abs; + +public class Line implements Shapes { + public static final String REGEX = "-"; + private final List coordinates; + + public Line(String expression) { + + if (!expression.contains(REGEX)) { + throw new IllegalArgumentException("식이 틀렸습니다."); + } + + if (expression.split(REGEX).length != 2) { + throw new IllegalArgumentException("좌표는 두개 만 들어가야 합니다."); + } + + List coordinateList = Arrays.asList( + new Coordinate(expression.split(REGEX)[0]), + new Coordinate(expression.split(REGEX)[1]) + ); + + this.coordinates = coordinateList; + } + + @Override + public double getResult() { + return getDistance(coordinates); + } + + @Override + public List findCoordinates() { + return new ArrayList<>(coordinates); + } + + public double getDistance(List coordinates) { + Coordinate coordinate = coordinates.get(0); + Coordinate otherCoordinate = coordinates.get(1); + + return Math.sqrt( + abs((coordinate.getX() - otherCoordinate.getX()) * (coordinate.getX() - otherCoordinate.getX()) + - (coordinate.getY() - otherCoordinate.getY()) * (coordinate.getY() - otherCoordinate.getY()))); + } +} diff --git a/src/main/java/coordinate/domain/LineCalculator.java b/src/main/java/coordinate/domain/LineCalculator.java deleted file mode 100644 index fb198f9f..00000000 --- a/src/main/java/coordinate/domain/LineCalculator.java +++ /dev/null @@ -1,25 +0,0 @@ -package coordinate.domain; - -public class LineCalculator { - - private final CoordinateGraphClient coordinateGraphClient; - private final CoordinateInputClient coordinateInputClient; - - public LineCalculator(CoordinateGraphClient coordinateGraphClient, CoordinateInputClient coordinateInputClient) { - this.coordinateGraphClient = coordinateGraphClient; - this.coordinateInputClient = coordinateInputClient; - } - - public StringExpression input() { - String stringExpression = coordinateInputClient.inputString(); - return new StringExpression(stringExpression); - } - - public double calculate(StringExpression expression) { - return expression.getDistance(); - } - - public boolean display(StringExpression expression) { - return coordinateGraphClient.displayGraph(expression.getFirstCoordinate(), expression.getSecondCoordinate()); - } -} diff --git a/src/main/java/coordinate/domain/Rectangle.java b/src/main/java/coordinate/domain/Rectangle.java new file mode 100644 index 00000000..a2326830 --- /dev/null +++ b/src/main/java/coordinate/domain/Rectangle.java @@ -0,0 +1,63 @@ +package coordinate.domain; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class Rectangle implements Shapes { + public static final String REGEX = "-"; + private final List coordinates; + + public Rectangle(String expression) { + + if (!expression.contains(REGEX)) { + throw new IllegalArgumentException("식이 틀렸습니다."); + } + + if (expression.split(REGEX).length != 4) { + throw new IllegalArgumentException("좌표는 두개 만 들어가야 합니다."); + } + + List coordinateList = Arrays.asList( + new Coordinate(expression.split(REGEX)[0]), + new Coordinate(expression.split(REGEX)[1]), + new Coordinate(expression.split(REGEX)[2]), + new Coordinate(expression.split(REGEX)[3]) + ); + + if (coordinateList.stream().map(Coordinate::getX).distinct().count() != 2) { + throw new IllegalArgumentException(); + } + + if (coordinateList.stream().map(Coordinate::getY).distinct().count() != 2) { + throw new IllegalArgumentException(); + } + + this.coordinates = coordinateList; + + } + + @Override + public double getResult() { + return getArea(coordinates); + } + + private double getArea(List coordinates) { + Double rangeX = getRange(coordinates.stream().map(Coordinate::getX)); + Double rangeY = getRange(coordinates.stream().map(Coordinate::getY)); + return rangeX * rangeY; + } + + private Double getRange(Stream stream) { + return stream.distinct().reduce((aDouble, aDouble2) -> Math.abs(aDouble - aDouble2)) + .orElseThrow(IllegalArgumentException::new); + } + + @Override + public List findCoordinates() { + return new ArrayList<>(coordinates); + } + +} diff --git a/src/main/java/coordinate/domain/Shapes.java b/src/main/java/coordinate/domain/Shapes.java new file mode 100644 index 00000000..c069b91a --- /dev/null +++ b/src/main/java/coordinate/domain/Shapes.java @@ -0,0 +1,9 @@ +package coordinate.domain; + +import java.util.List; + +public interface Shapes { + double getResult(); + + List findCoordinates(); +} diff --git a/src/main/java/coordinate/domain/StringExpression.java b/src/main/java/coordinate/domain/StringExpression.java deleted file mode 100644 index 0e4a271d..00000000 --- a/src/main/java/coordinate/domain/StringExpression.java +++ /dev/null @@ -1,44 +0,0 @@ -package coordinate.domain; - -import coordinate.domain.Coordinate; -import org.jetbrains.annotations.NotNull; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class StringExpression { - private static final String X_1 = "x1"; - private static final String Y_1 = "y1"; - private static final String X_2 = "x2"; - private static final String Y_2 = "y2"; - private final static Pattern PATTERN = Pattern - .compile("\\((?<" + X_1 + ">\\d+),(?<" + Y_1 + ">\\d+)\\)-\\((?<" + X_2 + ">\\d+),(?<" + Y_2 + ">\\d+)\\)"); - private final Coordinate firstCoordinate; - private final Coordinate secondCoordinate; - - public StringExpression(String expression) { - Matcher matcher = PATTERN.matcher(expression); - if (!matcher.matches()) { - throw new IllegalArgumentException(); - } - firstCoordinate = getCoordinate(matcher, X_1, Y_1); - secondCoordinate = getCoordinate(matcher, X_2, Y_2); - } - - public Coordinate getFirstCoordinate() { - return firstCoordinate; - } - - public Coordinate getSecondCoordinate() { - return secondCoordinate; - } - - @NotNull - private Coordinate getCoordinate(Matcher matcher, String x1, String y1) { - return new Coordinate(matcher.group(x1), matcher.group(y1)); - } - - public double getDistance() { - return firstCoordinate.getDistance(secondCoordinate); - } -} diff --git a/src/test/java/coordinate/domain/CoordinateTest.java b/src/test/java/coordinate/domain/CoordinateTest.java index c0f91372..6ea41900 100644 --- a/src/test/java/coordinate/domain/CoordinateTest.java +++ b/src/test/java/coordinate/domain/CoordinateTest.java @@ -1,73 +1,57 @@ package coordinate.domain; -import coordinate.domain.Coordinate; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; class CoordinateTest { @Test - @DisplayName("x, y 값을 입력해 좌표를 생성한다.") - void test1() { - //when & then + @DisplayName("좌표를 입력받아 좌표를 생성합니다.") + void test() { + String 좌표 = "(10,10)"; assertDoesNotThrow( - () -> new Coordinate("1", "4") + () -> new Coordinate(좌표) ); } @Test - @DisplayName("좌표는 음수이면 IllegalArgumentException 예외가 발생한다.") - void test2() { - // given - String x = "-1"; - String y = "1"; - - //when & then - Assertions.assertThatThrownBy( - () -> new Coordinate(x, y) + @DisplayName("입력되는 식은 정규 표현식에 맞지 않으면 IllegalArgumentException 예외가 발생합니다.") + void test1() { + String 좌표 = "(1010)"; + assertThatThrownBy( + () -> new Coordinate(좌표) ).isInstanceOf(IllegalArgumentException.class); } @Test - @DisplayName("좌표는 25이상이면 IllegalArgumentException 예외가 발생한다.") - void test3() { - // given - String x = "25"; - String y = "1"; - - //when & then - Assertions.assertThatThrownBy( - () -> new Coordinate(x, y) + @DisplayName("식 내의 좌표에 숫자가 들어가지 않으면 IllegalArgumentException 예외가 발생합니다.") + void test2() { + String 좌표 = "(10,string)"; + assertThatThrownBy( + () -> new Coordinate(좌표) ).isInstanceOf(IllegalArgumentException.class); } - @Test - @DisplayName("좌표에 입력 값에 숫자가 아닌 문자가 들어가면 IllegalArgumentException 예외가 발생한다.") - void test4() { - // given - String x = "test"; - String y = "1"; - - //when & then - Assertions.assertThatThrownBy( - () -> new Coordinate(x, y) + @ParameterizedTest + @DisplayName("0 미만의 숫자가 들어가면 예외가 발생합니다.") + @ValueSource(strings = {"(-1,-5)", "(5,-1)"}) + void test3(String 좌표) { + assertThatThrownBy( + () -> new Coordinate(좌표) ).isInstanceOf(IllegalArgumentException.class); } - private static final String 입력값 = "(10,10)-(14,15)"; - - @Test - @DisplayName("자신의 위치와 입력받는 위치의 직선 상의 거리를 계산한다.") - void test5() { - //given - Coordinate 자신 = new Coordinate("10", "10"); - Coordinate 입력값 = new Coordinate("14", "15"); - - //when & then - assertEquals(3.0, 자신.getDistance(입력값), 0.1); + @ParameterizedTest + @DisplayName("24 이상의 숫자가 들어가면 예외가 발생합니다.") + @ValueSource(strings = {"(5,25)", "(25,3)"}) + void test4(String 좌표) { + assertThatThrownBy( + () -> new Coordinate(좌표) + ).isInstanceOf(IllegalArgumentException.class); } } diff --git a/src/test/java/coordinate/domain/LineCalculatorTest.java b/src/test/java/coordinate/domain/LineCalculatorTest.java deleted file mode 100644 index 039a6b6c..00000000 --- a/src/test/java/coordinate/domain/LineCalculatorTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package coordinate.domain; - -import coordinate.fake.FakeCoordinateGraphClient; -import coordinate.fake.FakeCoordinateInputClient; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class LineCalculatorTest { - - private FakeCoordinateGraphClient fakeCoordinateGraphClient = new FakeCoordinateGraphClient(); - private FakeCoordinateInputClient fakeCoordinateInputClient = new FakeCoordinateInputClient(); - private LineCalculator lineCalculator; - - @BeforeEach - void setUp() { - lineCalculator = new LineCalculator(fakeCoordinateGraphClient, fakeCoordinateInputClient); - } - - @Test - @DisplayName("좌표 두 개를 표에 찍는다.") - void test6() { - //given - StringExpression expression = lineCalculator.input(); - - //when - boolean isDisplayed = lineCalculator.display(expression); - - //then - assertTrue(isDisplayed); - } - - @Test - @DisplayName("좌 표 두 개의 직선상의 거리를 계산한다.") - void test8() { - //given - StringExpression expression = lineCalculator.input(); - double expected = 3.0; - - //when - double actual = lineCalculator.calculate(expression); - - //then - assertEquals(expected, actual, 0.1); - } - -} diff --git a/src/test/java/coordinate/domain/LineTest.java b/src/test/java/coordinate/domain/LineTest.java new file mode 100644 index 00000000..92dafb49 --- /dev/null +++ b/src/test/java/coordinate/domain/LineTest.java @@ -0,0 +1,62 @@ +package coordinate.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class LineTest { + + @Test + @DisplayName("좌표 두 개를 가지고 있습니다.") + void test1() { + // given + String 좌표_두개 = "(10,10)-(14,15)"; + Line 선 = new Line(좌표_두개); + + // when & then + assertThat(선.findCoordinates()).hasSize(2); + } + + @Test + @DisplayName("답을 출력합니다.") + void test2() { + // given + String 좌표_두개 = "(10,10)-(14,15)"; + Line 선 = new Line(좌표_두개); + + // when & then + assertThat(선.getResult()).isExactlyInstanceOf(Double.class); + } + + @Test + @DisplayName("답은 길이입니다.") + void test3() { + // given + String 좌표_두개 = "(10,10)-(10,15)"; + double 길이 = 5.0; + Line 선 = new Line(좌표_두개); + + // when & then + assertThat(선.getResult()).isEqualTo(길이); + } + + @Test + @DisplayName("- 로 나눠지는 좌표가 없으면 예외가 발생합니다.") + void test4() { + String 이상한_식 = "(10,10)(14,15)"; + assertThatThrownBy( + () -> new Line(이상한_식) + ).isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("- 로 나눠지는 좌표가 세개 이상이면 예외가 발생합니다.") + void test5() { + String 이상한_식 = "(10,10)-(14,15)-(13,15)"; + assertThatThrownBy( + () -> new Line(이상한_식) + ).isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/coordinate/domain/RectangleTest.java b/src/test/java/coordinate/domain/RectangleTest.java new file mode 100644 index 00000000..9491e2e2 --- /dev/null +++ b/src/test/java/coordinate/domain/RectangleTest.java @@ -0,0 +1,57 @@ +package coordinate.domain; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; + +class RectangleTest { + + @Test + @DisplayName("좌표 네 개를 가지고 있습니다.") + void test1() { + // given + String 식 = "(10,10)-(22,10)-(22,18)-(10,18)"; + + // when & then + assertDoesNotThrow( + () -> new Rectangle(식) + ); + } + + @ParameterizedTest + @ValueSource(strings = {"(10,10)-(22,10)-(22,18)-(10,1)", "(10,10)-(22,10)-(22,18)-(1,18)"}) + @DisplayName("네 점이 뒤틀어진 사다리꼴이나 마름모가 입력이 되면 IllegalArgumentException 예외가 발생합니다.") + void test2(String 식) { + // when & then + assertThatThrownBy( + () -> new Rectangle(식) + ).isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("넓이를 계산합니다.") + void test5() { + // given + String 식 = "(10,10)-(22,10)-(22,18)-(10,18)"; + Rectangle 직사각형 = new Rectangle(식); + double 넓이 = 직사각형.getResult(); + + // when & then + assertThat(넓이).isEqualTo(96.0); + } + + @Test + @DisplayName("좌표를 출력합니다.") + void test6() { + // given + String 식 = "(10,10)-(22,10)-(22,18)-(10,18)"; + Rectangle 직사각형 = new Rectangle(식); + + assertThat(직사각형.findCoordinates()).hasSize(4); + } +} diff --git a/src/test/java/coordinate/domain/StringExpressionTest.java b/src/test/java/coordinate/domain/StringExpressionTest.java deleted file mode 100644 index 7d79da0a..00000000 --- a/src/test/java/coordinate/domain/StringExpressionTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package coordinate.domain; - -import coordinate.domain.StringExpression; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; - -class StringExpressionTest { - - private static final String 입력값 = "(10,10)-(14,15)"; - - @Test - @DisplayName("식을 입력받는다.") - void test1() { - //when & then - assertDoesNotThrow( - () -> new StringExpression(입력값) - ); - } - - @Test - @DisplayName("식은 괄호\"(\", \")\"로 둘러쌓여 있으며 쉼표(,)로 좌표를 구분한다.") - void test2() { - //given - String stringExpression = 입력값; - - //when & then - assertDoesNotThrow( - () -> new StringExpression(stringExpression) - ); - } - - @Test - @DisplayName("식이 포멧에 맞지 않으면 예외가 발생한다.") - void test3() { - //given - String 실패되는_입력_값 = "10, 12"; - - //when & then - assertThatThrownBy( - () -> new StringExpression(실패되는_입력_값) - ).isInstanceOf(IllegalArgumentException.class); - } - - - @Test - @DisplayName("식에서 좌표 두 개를 추출한다.") - void test4() { - // given - String stringExpression = 입력값; - - // when - StringExpression expression = new StringExpression(stringExpression); - - // then - assertThat(expression.getFirstCoordinate()).isNotNull(); - assertThat(expression.getSecondCoordinate()).isNotNull(); - } - - @Test - @DisplayName("식을 계산한다.") - void test5() { - // given - String stringExpression = 입력값; - // when - StringExpression expression = new StringExpression(stringExpression); - // then - assertEquals(3.0, expression.getDistance(), 0.1); - } -} diff --git a/src/test/java/coordinate/fake/FakeCoordinateGraphClient.java b/src/test/java/coordinate/fake/FakeCoordinateGraphClient.java deleted file mode 100644 index ec8d7728..00000000 --- a/src/test/java/coordinate/fake/FakeCoordinateGraphClient.java +++ /dev/null @@ -1,11 +0,0 @@ -package coordinate.fake; - -import coordinate.domain.Coordinate; -import coordinate.domain.CoordinateGraphClient; - -public class FakeCoordinateGraphClient implements CoordinateGraphClient { - @Override - public boolean displayGraph(Coordinate firstCoordinate, Coordinate secondCoordinate) { - return firstCoordinate.getDistance(secondCoordinate) < 5; - } -} diff --git a/src/test/java/coordinate/fake/FakeCoordinateInputClient.java b/src/test/java/coordinate/fake/FakeCoordinateInputClient.java deleted file mode 100644 index bd40b5f7..00000000 --- a/src/test/java/coordinate/fake/FakeCoordinateInputClient.java +++ /dev/null @@ -1,10 +0,0 @@ -package coordinate.fake; - -import coordinate.domain.CoordinateInputClient; - -public class FakeCoordinateInputClient implements CoordinateInputClient { - @Override - public String inputString() { - return "(10,10)-(14,15)"; - } -} From dd4dc9c7efb7f6b60f5e749df2816ab967c81d5e Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 18 Jul 2022 21:05:37 +0900 Subject: [PATCH 10/18] =?UTF-8?q?Refact=20:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=95=85=EC=B7=A8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/CoordinateMain.java | 4 +++- src/main/java/coordinate/domain/Rectangle.java | 1 - src/main/java/rentcompany/Car.java | 4 ++-- src/test/java/coordinate/domain/RectangleTest.java | 6 +++--- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/coordinate/CoordinateMain.java b/src/main/java/coordinate/CoordinateMain.java index 2180cacd..18832848 100644 --- a/src/main/java/coordinate/CoordinateMain.java +++ b/src/main/java/coordinate/CoordinateMain.java @@ -1,6 +1,8 @@ package coordinate; -import coordinate.domain.*; +import coordinate.domain.Coordinate; +import coordinate.domain.CoordinateGraphClient; +import coordinate.domain.CoordinateInputClient; import java.util.List; diff --git a/src/main/java/coordinate/domain/Rectangle.java b/src/main/java/coordinate/domain/Rectangle.java index a2326830..a66cb1f8 100644 --- a/src/main/java/coordinate/domain/Rectangle.java +++ b/src/main/java/coordinate/domain/Rectangle.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; import java.util.stream.Stream; public class Rectangle implements Shapes { diff --git a/src/main/java/rentcompany/Car.java b/src/main/java/rentcompany/Car.java index debe3229..03b2a319 100644 --- a/src/main/java/rentcompany/Car.java +++ b/src/main/java/rentcompany/Car.java @@ -1,6 +1,6 @@ package rentcompany; -public abstract class Car implements Vehicle{ +public abstract class Car implements Vehicle { /** * 리터당 이동 거리. 즉, 연비 @@ -26,6 +26,6 @@ public abstract class Car implements Vehicle{ @Override public String report() { - return getName() + " : " + (int)getChargeQuantity() + "리터"; + return getName() + " : " + (int) getChargeQuantity() + "리터"; } } diff --git a/src/test/java/coordinate/domain/RectangleTest.java b/src/test/java/coordinate/domain/RectangleTest.java index 9491e2e2..d36d239d 100644 --- a/src/test/java/coordinate/domain/RectangleTest.java +++ b/src/test/java/coordinate/domain/RectangleTest.java @@ -1,13 +1,13 @@ package coordinate.domain; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; class RectangleTest { From 67d70b0b3b9f36db7fd7eb7e85e02d965ad623bc Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 18 Jul 2022 21:09:33 +0900 Subject: [PATCH 11/18] =?UTF-8?q?Refact=20:=20CoordinatesCalculator=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=9E=AC=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f1140e87..5e071f37 100644 --- a/README.md +++ b/README.md @@ -48,12 +48,8 @@ - 행위 - 입력을 받습니다. - 입력이 선 인지 직사각형인지 판단합니다. - - 선인 경우 선의 길이를 계산합니다. - - 직사각형인 경우 직사각형의 넓이를 계산합니다. - - 답을 출력합니다. - - 도형의 답을 출력합니다. - - 좌표를 출력합니다. - - 도형에게 좌표를 가져와 좌표그래프에 답을 출력합니다. + - 답을 가져옵니다. + - 도형에게 좌표를 가져옵니다. - 도형 - 행위 - 답을 출력합니다. From 697d164805962da10f3d2a7ddbac3902e335dc46 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 18 Jul 2022 21:22:14 +0900 Subject: [PATCH 12/18] =?UTF-8?q?Feat=20:=20CoordinatesCalculator=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=A7=84=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/CoordinatesCalculator.java | 30 +++++++++ .../domain/CoordinatesCalculatorTest.java | 66 +++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 src/test/java/coordinate/domain/CoordinatesCalculatorTest.java diff --git a/src/main/java/coordinate/domain/CoordinatesCalculator.java b/src/main/java/coordinate/domain/CoordinatesCalculator.java index ac9ce0df..68edf90e 100644 --- a/src/main/java/coordinate/domain/CoordinatesCalculator.java +++ b/src/main/java/coordinate/domain/CoordinatesCalculator.java @@ -1,4 +1,34 @@ package coordinate.domain; +import java.util.List; + public class CoordinatesCalculator { + private static final String REGEX = "-"; + private final Shapes shapes; + + public CoordinatesCalculator(String expression) { + if (expression.split(REGEX).length == 2) { + shapes = new Line(expression); + return; + } + + if (expression.split(REGEX).length == 4) { + shapes = new Rectangle(expression); + return; + } + + throw new IllegalArgumentException(); + } + + public Shapes getShapes() { + return shapes; + } + + public Double getResult() { + return shapes.getResult(); + } + + public List findCoordinates() { + return shapes.findCoordinates(); + } } diff --git a/src/test/java/coordinate/domain/CoordinatesCalculatorTest.java b/src/test/java/coordinate/domain/CoordinatesCalculatorTest.java new file mode 100644 index 00000000..0b1bb5c2 --- /dev/null +++ b/src/test/java/coordinate/domain/CoordinatesCalculatorTest.java @@ -0,0 +1,66 @@ +package coordinate.domain; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; + +class CoordinatesCalculatorTest { + + @ParameterizedTest + @ValueSource(strings = {"(10,10)-(14,15)", "(10,10)-(22,10)-(22,18)-(10,18)"}) + @DisplayName("입력을 받습니다.") + void test1(String 식) { + Assertions.assertDoesNotThrow( + () -> new CoordinatesCalculator(식) + ); + } + + @ParameterizedTest + @ValueSource(strings = {"(10,10)-(14,15)", "(10,10)-(22,10)-(22,18)-(10,18)"}) + @DisplayName("입력이 선 인지 직사각형인지 판단합니다.") + void test2(String 식) { + CoordinatesCalculator calculator = new CoordinatesCalculator(식); + + if (식.equals("(10,10)-(14,15)")) { + assertThat(calculator.getShapes()).isInstanceOf(Line.class); + } + + if (식.equals("(10,10)-(22,10)-(22,18)-(10,18)")) { + assertThat(calculator.getShapes()).isInstanceOf(Rectangle.class); + } + } + + @ParameterizedTest + @ValueSource(strings = {"(10,10)-(10,15)", "(10,10)-(22,10)-(22,18)-(10,18)"}) + @DisplayName("답을 출력합니다.") + void test3(String 식) { + CoordinatesCalculator calculator = new CoordinatesCalculator(식); + + if (식.equals("(10,10)-(10,15)")) { + assertThat(calculator.getResult()).isEqualTo(5.0); + } + + if (식.equals("(10,10)-(22,10)-(22,18)-(10,18)")) { + assertThat(calculator.getResult()).isEqualTo(96.0); + } + } + + @ParameterizedTest + @ValueSource(strings = {"(10,10)-(10,15)", "(10,10)-(22,10)-(22,18)-(10,18)"}) + @DisplayName("좌표를 출력합니다.") + void test4(String 식) { + CoordinatesCalculator calculator = new CoordinatesCalculator(식); + + if (식.equals("(10,10)-(14,15)")) { + assertThat(calculator.findCoordinates()).hasSize(2); + } + + if (식.equals("(10,10)-(22,10)-(22,18)-(10,18)")) { + assertThat(calculator.findCoordinates()).hasSize(4); + } + } +} From 7e446bee1e9c604020554d58f0fd74f1c5180e9c Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 18 Jul 2022 21:25:24 +0900 Subject: [PATCH 13/18] =?UTF-8?q?Fix=20:=20=EA=B1=B0=EB=A6=AC=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/domain/Line.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/coordinate/domain/Line.java b/src/main/java/coordinate/domain/Line.java index e4dc5ff4..83ac74b9 100644 --- a/src/main/java/coordinate/domain/Line.java +++ b/src/main/java/coordinate/domain/Line.java @@ -44,6 +44,6 @@ public double getDistance(List coordinates) { return Math.sqrt( abs((coordinate.getX() - otherCoordinate.getX()) * (coordinate.getX() - otherCoordinate.getX()) - - (coordinate.getY() - otherCoordinate.getY()) * (coordinate.getY() - otherCoordinate.getY()))); + + (coordinate.getY() - otherCoordinate.getY()) * (coordinate.getY() - otherCoordinate.getY()))); } } From 1c050e02088745430fc8b32abee7fd908cfb14ea Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 18 Jul 2022 21:25:38 +0900 Subject: [PATCH 14/18] =?UTF-8?q?Feat=20:=20Main=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/CoordinateMain.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/coordinate/CoordinateMain.java b/src/main/java/coordinate/CoordinateMain.java index 18832848..08b78e6d 100644 --- a/src/main/java/coordinate/CoordinateMain.java +++ b/src/main/java/coordinate/CoordinateMain.java @@ -3,6 +3,7 @@ import coordinate.domain.Coordinate; import coordinate.domain.CoordinateGraphClient; import coordinate.domain.CoordinateInputClient; +import coordinate.domain.CoordinatesCalculator; import java.util.List; @@ -22,16 +23,12 @@ public boolean displayGraph(List coordinates) { } }; -// LineCalculator lineCalculator = new LineCalculator(coordinateGraphClient, coordinateInputClient); + CoordinatesCalculator calculator = new CoordinatesCalculator(coordinateInputClient.inputString()); - //input -// Line expression = lineCalculator.input(); + // display + coordinateGraphClient.displayGraph(calculator.findCoordinates()); - //display -// lineCalculator.display(expression); - - //calculate -// double value = lineCalculator.calculate(expression); -// System.out.println(value); + // print result + System.out.println("답은 " + calculator.getResult() + "입니다."); } } From bb6ba174ab1cf3adb9f2931dd9ca4546a0fad096 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 18 Jul 2022 21:42:19 +0900 Subject: [PATCH 15/18] =?UTF-8?q?Refact=20:=20=EB=8B=B5=EC=9D=84=20?= =?UTF-8?q?=EA=B5=AC=ED=95=98=EB=8A=94=20=EB=B0=A9=EC=8B=9D=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/domain/Line.java | 7 ++---- .../java/coordinate/domain/Rectangle.java | 25 +++++++++++++------ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/main/java/coordinate/domain/Line.java b/src/main/java/coordinate/domain/Line.java index 83ac74b9..33cdb5bc 100644 --- a/src/main/java/coordinate/domain/Line.java +++ b/src/main/java/coordinate/domain/Line.java @@ -30,7 +30,7 @@ public Line(String expression) { @Override public double getResult() { - return getDistance(coordinates); + return getDistance(coordinates.get(0), coordinates.get(1)); } @Override @@ -38,10 +38,7 @@ public List findCoordinates() { return new ArrayList<>(coordinates); } - public double getDistance(List coordinates) { - Coordinate coordinate = coordinates.get(0); - Coordinate otherCoordinate = coordinates.get(1); - + private double getDistance(Coordinate coordinate, Coordinate otherCoordinate) { return Math.sqrt( abs((coordinate.getX() - otherCoordinate.getX()) * (coordinate.getX() - otherCoordinate.getX()) + (coordinate.getY() - otherCoordinate.getY()) * (coordinate.getY() - otherCoordinate.getY()))); diff --git a/src/main/java/coordinate/domain/Rectangle.java b/src/main/java/coordinate/domain/Rectangle.java index a66cb1f8..3783b178 100644 --- a/src/main/java/coordinate/domain/Rectangle.java +++ b/src/main/java/coordinate/domain/Rectangle.java @@ -3,7 +3,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.stream.Stream; +import java.util.stream.Collectors; + +import static java.lang.Math.abs; public class Rectangle implements Shapes { public static final String REGEX = "-"; @@ -44,13 +46,14 @@ public double getResult() { } private double getArea(List coordinates) { - Double rangeX = getRange(coordinates.stream().map(Coordinate::getX)); - Double rangeY = getRange(coordinates.stream().map(Coordinate::getY)); - return rangeX * rangeY; - } - - private Double getRange(Stream stream) { - return stream.distinct().reduce((aDouble, aDouble2) -> Math.abs(aDouble - aDouble2)) + List distanceList = Arrays.asList( + getDistance(coordinates.get(0), coordinates.get(1)), + getDistance(coordinates.get(1), coordinates.get(2)), + getDistance(coordinates.get(2), coordinates.get(3)), + getDistance(coordinates.get(3), coordinates.get(0)) + ); + return distanceList.stream().distinct() + .reduce((double1, double2) -> double1 * double2) .orElseThrow(IllegalArgumentException::new); } @@ -59,4 +62,10 @@ public List findCoordinates() { return new ArrayList<>(coordinates); } + public double getDistance(Coordinate coordinate, Coordinate otherCoordinate) { + return Math.sqrt( + abs((coordinate.getX() - otherCoordinate.getX()) * (coordinate.getX() - otherCoordinate.getX()) + + (coordinate.getY() - otherCoordinate.getY()) * (coordinate.getY() - otherCoordinate.getY()))); + } + } From 589b963c0e40fad7abaa2f38e01125427f843735 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 18 Jul 2022 21:42:31 +0900 Subject: [PATCH 16/18] =?UTF-8?q?Docs=20:=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 5e071f37..92485046 100644 --- a/README.md +++ b/README.md @@ -83,3 +83,19 @@ - 좌표를 입력받습니다. - 입력되는 식은 정규 표현식에 맞아야 합니다. - 입력되는 좌표는 숫자가 들어가야 합니다. + + +### 추가된 요구사항 + +- 좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. +- 좌표값을 세 개 입력한 경우, 세 점을 연결하는 삼각형으로 가정한다. +- 삼각형인 경우 삼각형의 넓이를 계산해서 출력한다. + +삼각형 +- 상태 + - 좌표 세 개를 가지고 있습니다. +- 행위 + - 답을 출력합니다. + - 답은 넓이입니다. + - 헤론의 공식을 통해 넓이를 구합니다. + - 좌표를 출력합니다. From c727b992e676f5f6b4bb90ebb8fb55b6cd0f351f Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 18 Jul 2022 21:45:45 +0900 Subject: [PATCH 17/18] =?UTF-8?q?Fix=20:=20Rectangle=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=88=98=EC=A0=95=20=EB=B0=8F?= =?UTF-8?q?=20=EC=A0=91=EA=B7=BC=20=EC=A0=9C=EC=96=B4=EC=9E=90=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/domain/Rectangle.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/coordinate/domain/Rectangle.java b/src/main/java/coordinate/domain/Rectangle.java index 3783b178..8a692eee 100644 --- a/src/main/java/coordinate/domain/Rectangle.java +++ b/src/main/java/coordinate/domain/Rectangle.java @@ -18,7 +18,7 @@ public Rectangle(String expression) { } if (expression.split(REGEX).length != 4) { - throw new IllegalArgumentException("좌표는 두개 만 들어가야 합니다."); + throw new IllegalArgumentException("좌표는 네 개 만 들어가야 합니다."); } List coordinateList = Arrays.asList( @@ -28,16 +28,18 @@ public Rectangle(String expression) { new Coordinate(expression.split(REGEX)[3]) ); - if (coordinateList.stream().map(Coordinate::getX).distinct().count() != 2) { - throw new IllegalArgumentException(); - } + List distanceList = Arrays.asList( + getDistance(coordinateList.get(0), coordinateList.get(1)), + getDistance(coordinateList.get(1), coordinateList.get(2)), + getDistance(coordinateList.get(2), coordinateList.get(3)), + getDistance(coordinateList.get(3), coordinateList.get(0)) + ); - if (coordinateList.stream().map(Coordinate::getY).distinct().count() != 2) { + if (distanceList.stream().distinct().count() != 2) { throw new IllegalArgumentException(); } this.coordinates = coordinateList; - } @Override @@ -62,7 +64,7 @@ public List findCoordinates() { return new ArrayList<>(coordinates); } - public double getDistance(Coordinate coordinate, Coordinate otherCoordinate) { + private double getDistance(Coordinate coordinate, Coordinate otherCoordinate) { return Math.sqrt( abs((coordinate.getX() - otherCoordinate.getX()) * (coordinate.getX() - otherCoordinate.getX()) + (coordinate.getY() - otherCoordinate.getY()) * (coordinate.getY() - otherCoordinate.getY()))); From f0c939e9a2b81d3f9237f157bc6c493ce57c4af3 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 18 Jul 2022 22:00:19 +0900 Subject: [PATCH 18/18] =?UTF-8?q?Feat=20:=20=EC=82=BC=EA=B0=81=ED=98=95=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=A7=84=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/CoordinatesCalculator.java | 5 ++ .../java/coordinate/domain/Rectangle.java | 1 - src/main/java/coordinate/domain/Triangle.java | 57 +++++++++++++++++++ .../domain/CoordinatesCalculatorTest.java | 22 +++++-- .../java/coordinate/domain/TriangleTest.java | 56 ++++++++++++++++++ 5 files changed, 135 insertions(+), 6 deletions(-) create mode 100644 src/main/java/coordinate/domain/Triangle.java create mode 100644 src/test/java/coordinate/domain/TriangleTest.java diff --git a/src/main/java/coordinate/domain/CoordinatesCalculator.java b/src/main/java/coordinate/domain/CoordinatesCalculator.java index 68edf90e..3283a887 100644 --- a/src/main/java/coordinate/domain/CoordinatesCalculator.java +++ b/src/main/java/coordinate/domain/CoordinatesCalculator.java @@ -12,6 +12,11 @@ public CoordinatesCalculator(String expression) { return; } + if (expression.split(REGEX).length == 3) { + shapes = new Triangle(expression); + return; + } + if (expression.split(REGEX).length == 4) { shapes = new Rectangle(expression); return; diff --git a/src/main/java/coordinate/domain/Rectangle.java b/src/main/java/coordinate/domain/Rectangle.java index 8a692eee..26137ad0 100644 --- a/src/main/java/coordinate/domain/Rectangle.java +++ b/src/main/java/coordinate/domain/Rectangle.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; import static java.lang.Math.abs; diff --git a/src/main/java/coordinate/domain/Triangle.java b/src/main/java/coordinate/domain/Triangle.java new file mode 100644 index 00000000..f53f5993 --- /dev/null +++ b/src/main/java/coordinate/domain/Triangle.java @@ -0,0 +1,57 @@ +package coordinate.domain; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static java.lang.Math.abs; +import static java.lang.Math.sqrt; + +public class Triangle implements Shapes { + public static final String REGEX = "-"; + private final List coordinates; + + + public Triangle(String expression) { + + if (!expression.contains(REGEX)) { + throw new IllegalArgumentException("식이 틀렸습니다."); + } + + if (expression.split(REGEX).length != 3) { + throw new IllegalArgumentException("좌표는 세 개만 들어가야 합니다."); + } + + List coordinateList = Arrays.asList( + new Coordinate(expression.split(REGEX)[0]), + new Coordinate(expression.split(REGEX)[1]), + new Coordinate(expression.split(REGEX)[2]) + ); + + this.coordinates = coordinateList; + } + + @Override + public double getResult() { + return getArea(this.coordinates); + } + + private double getArea(List coordinates) { + double a = getDistance(coordinates.get(0), coordinates.get(1)); + double b = getDistance(coordinates.get(1), coordinates.get(2)); + double c = getDistance(coordinates.get(2), coordinates.get(0)); + double s = (a + b + c) / 2; + return sqrt(s * (s - a) * (s - b) * (s - c)); + } + + @Override + public List findCoordinates() { + return new ArrayList<>(this.coordinates); + } + + private double getDistance(Coordinate coordinate, Coordinate otherCoordinate) { + return sqrt( + abs((coordinate.getX() - otherCoordinate.getX()) * (coordinate.getX() - otherCoordinate.getX()) + + (coordinate.getY() - otherCoordinate.getY()) * (coordinate.getY() - otherCoordinate.getY()))); + } +} diff --git a/src/test/java/coordinate/domain/CoordinatesCalculatorTest.java b/src/test/java/coordinate/domain/CoordinatesCalculatorTest.java index 0b1bb5c2..41641a5d 100644 --- a/src/test/java/coordinate/domain/CoordinatesCalculatorTest.java +++ b/src/test/java/coordinate/domain/CoordinatesCalculatorTest.java @@ -2,16 +2,16 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.offset; class CoordinatesCalculatorTest { @ParameterizedTest - @ValueSource(strings = {"(10,10)-(14,15)", "(10,10)-(22,10)-(22,18)-(10,18)"}) + @ValueSource(strings = {"(10,10)-(14,15)", "(10,10)-(22,10)-(22,18)-(10,18)", "(10,10)-(14,15)-(20,8)"}) @DisplayName("입력을 받습니다.") void test1(String 식) { Assertions.assertDoesNotThrow( @@ -20,7 +20,7 @@ void test1(String 식) { } @ParameterizedTest - @ValueSource(strings = {"(10,10)-(14,15)", "(10,10)-(22,10)-(22,18)-(10,18)"}) + @ValueSource(strings = {"(10,10)-(14,15)", "(10,10)-(22,10)-(22,18)-(10,18)", "(10,10)-(14,15)-(20,8)"}) @DisplayName("입력이 선 인지 직사각형인지 판단합니다.") void test2(String 식) { CoordinatesCalculator calculator = new CoordinatesCalculator(식); @@ -32,10 +32,14 @@ void test2(String 식) { if (식.equals("(10,10)-(22,10)-(22,18)-(10,18)")) { assertThat(calculator.getShapes()).isInstanceOf(Rectangle.class); } + + if (식.equals("(10,10)-(14,15)-(20,8)")) { + assertThat(calculator.getShapes()).isInstanceOf(Triangle.class); + } } @ParameterizedTest - @ValueSource(strings = {"(10,10)-(10,15)", "(10,10)-(22,10)-(22,18)-(10,18)"}) + @ValueSource(strings = {"(10,10)-(10,15)", "(10,10)-(22,10)-(22,18)-(10,18)", "(10,10)-(14,15)-(20,8)"}) @DisplayName("답을 출력합니다.") void test3(String 식) { CoordinatesCalculator calculator = new CoordinatesCalculator(식); @@ -47,10 +51,14 @@ void test3(String 식) { if (식.equals("(10,10)-(22,10)-(22,18)-(10,18)")) { assertThat(calculator.getResult()).isEqualTo(96.0); } + + if (식.equals("(10,10)-(14,15)-(20,8)")) { + assertThat(calculator.getResult()).isEqualTo(29.0, offset(0.0009)); + } } @ParameterizedTest - @ValueSource(strings = {"(10,10)-(10,15)", "(10,10)-(22,10)-(22,18)-(10,18)"}) + @ValueSource(strings = {"(10,10)-(10,15)", "(10,10)-(22,10)-(22,18)-(10,18)", "(10,10)-(14,15)-(20,8)"}) @DisplayName("좌표를 출력합니다.") void test4(String 식) { CoordinatesCalculator calculator = new CoordinatesCalculator(식); @@ -62,5 +70,9 @@ void test4(String 식) { if (식.equals("(10,10)-(22,10)-(22,18)-(10,18)")) { assertThat(calculator.findCoordinates()).hasSize(4); } + + if (식.equals("(10,10)-(14,15)-(20,8)")) { + assertThat(calculator.findCoordinates()).hasSize(3); + } } } diff --git a/src/test/java/coordinate/domain/TriangleTest.java b/src/test/java/coordinate/domain/TriangleTest.java new file mode 100644 index 00000000..335b86dd --- /dev/null +++ b/src/test/java/coordinate/domain/TriangleTest.java @@ -0,0 +1,56 @@ +package coordinate.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +class TriangleTest { + + @Test + @DisplayName("삼각형을 그릴 수 있습니다.") + void test() { + String 식 = "(10,10)-(14,15)-(20,8)"; + assertDoesNotThrow( + () -> new Triangle(식) + ); + } + + @Test + @DisplayName("식이 틀리면 예외가 발생합니다.") + void test1() { + String 식 = "(10,10)(14,15)-(20,8)"; + assertThatThrownBy( + () -> new Triangle(식) + ).isInstanceOf(IllegalArgumentException.class); + } + + + @ParameterizedTest + @ValueSource(strings = {"(14,15)-(20,8)", "(14,15)-(20,8)-(20,15)-(14,8)"}) + @DisplayName("좌표가 세개 이외의 값이 들어오면 예외가 발생합니다.") + void test2(String 식) { + assertThatThrownBy( + () -> new Triangle(식) + ).isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("답인 삼각형의 넓이를 출력합니다.") + void test3() { + String 식 = "(10,10)-(14,15)-(20,8)"; + Triangle 삼각형 = new Triangle(식); + assertThat(삼각형.getResult()).isEqualTo(29.0, offset(0.00099)); + } + + @Test + @DisplayName("좌표를 그리기 위해 좌표들을 출력합니다.") + void test4() { + String 식 = "(10,10)-(14,15)-(20,8)"; + Triangle 삼각형 = new Triangle(식); + assertThat(삼각형.findCoordinates()).hasSize(3); + } +}