From 2cf5df98535dab5f038adcf4fa93fc6bfab220c8 Mon Sep 17 00:00:00 2001 From: "https://github.com/youngreal" Date: Fri, 15 Jul 2022 14:50:34 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=EC=A2=8C=ED=91=9C=EA=B3=84?= =?UTF-8?q?=EC=82=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/Coordinate.java | 5 ++ .../java/coordinate/CoordinateFactory.java | 15 +++++ src/main/java/coordinate/Input.java | 17 ++++++ src/main/java/coordinate/InputConverter.java | 56 +++++++++++++++++++ src/main/java/coordinate/Main.java | 17 ++++++ src/main/java/coordinate/NotStraight.java | 16 ++++++ src/main/java/coordinate/Straight.java | 27 +++++++++ 7 files changed, 153 insertions(+) create mode 100644 src/main/java/coordinate/Coordinate.java create mode 100644 src/main/java/coordinate/CoordinateFactory.java create mode 100644 src/main/java/coordinate/Input.java create mode 100644 src/main/java/coordinate/InputConverter.java create mode 100644 src/main/java/coordinate/Main.java create mode 100644 src/main/java/coordinate/NotStraight.java create mode 100644 src/main/java/coordinate/Straight.java diff --git a/src/main/java/coordinate/Coordinate.java b/src/main/java/coordinate/Coordinate.java new file mode 100644 index 00000000..2316f5d6 --- /dev/null +++ b/src/main/java/coordinate/Coordinate.java @@ -0,0 +1,5 @@ +package coordinate; + +public interface Coordinate { + void printSpecialCharacter(); +} diff --git a/src/main/java/coordinate/CoordinateFactory.java b/src/main/java/coordinate/CoordinateFactory.java new file mode 100644 index 00000000..ef6fd7fc --- /dev/null +++ b/src/main/java/coordinate/CoordinateFactory.java @@ -0,0 +1,15 @@ +package coordinate; + +public class CoordinateFactory { + public void checkStraight(String inputCoordinate) { + if (inputCoordinate.contains("-")) { + String[] split = inputCoordinate.replace("-", ",").split(","); + Coordinate coordinate = new Straight(split); + coordinate.printSpecialCharacter(); + return; + } + String[] split = inputCoordinate.split(","); + Coordinate coordinate = new NotStraight(split); + coordinate.printSpecialCharacter(); + } +} diff --git a/src/main/java/coordinate/Input.java b/src/main/java/coordinate/Input.java new file mode 100644 index 00000000..48115dc6 --- /dev/null +++ b/src/main/java/coordinate/Input.java @@ -0,0 +1,17 @@ +package coordinate; + +import java.util.Scanner; + +public class Input { + public void inputCoordinate() throws IllegalArgumentException{ + System.out.println("좌표를 입력하세요."); + Scanner sc = new Scanner(System.in); + String line = sc.nextLine(); + validInput(line); + } + + private void validInput(String line) { + InputConverter inputConverter = new InputConverter(line); + inputConverter.something(); + } +} diff --git a/src/main/java/coordinate/InputConverter.java b/src/main/java/coordinate/InputConverter.java new file mode 100644 index 00000000..47a83b39 --- /dev/null +++ b/src/main/java/coordinate/InputConverter.java @@ -0,0 +1,56 @@ +package coordinate; + +import java.util.regex.Pattern; + +public class InputConverter { + private static final Pattern COORDINATE_PATTERN = Pattern.compile("^\\([0-9][0-9]?+,+[0-9][0-9]?\\)+|^\\([0-9][0-9]?+,+[0-9][0-9]?\\)+-+\\([0-9][0-9]?+,[0-9][0-9]?\\)$"); + private final String inputCoordinate; + + public InputConverter(String inputCoordinate) { + if (isNotMatchPattern(inputCoordinate)) { + throw new IllegalArgumentException("좌표형식을 확인해주세요"); + } + this.inputCoordinate = deleteParentheses(inputCoordinate); + validateCoordinateRange(); + } + + public void something() { + CoordinateFactory factory = new CoordinateFactory(); + factory.checkStraight(this.inputCoordinate); + } + + private boolean isNotMatchPattern(String inputCoordinate) { + return !COORDINATE_PATTERN.matcher(inputCoordinate).matches(); + } + + private void validateCoordinateRange() { + String[] tempLine; + if (this.inputCoordinate.contains("-")) { + tempLine = this.inputCoordinate.replace("-", ",").split(","); + checkRangeLoop(tempLine); + return; + } + tempLine = this.inputCoordinate.split(","); + checkRangeLoop(tempLine); + } + + private void checkRangeLoop(String[] tempLine) { + for (String input : tempLine) { + checkMaxRange(input); + } + } + + private void checkMaxRange(String input) { + if (isOverThanMaxRange(input)) { + throw new IllegalArgumentException("좌표는 24까지만 입력할수있습니다"); + } + } + + private boolean isOverThanMaxRange(String tempLine) { + return Integer.parseInt(tempLine) > 24; + } + + private String deleteParentheses(String inputCoordinate) { + return inputCoordinate.replaceAll("[^0-9,-]*", ""); + } +} diff --git a/src/main/java/coordinate/Main.java b/src/main/java/coordinate/Main.java new file mode 100644 index 00000000..c06bf2ec --- /dev/null +++ b/src/main/java/coordinate/Main.java @@ -0,0 +1,17 @@ +package coordinate; + +public class Main { + public static void main(String[] args) { + Input input = new Input(); + + while (true) { + try { + input.inputCoordinate(); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + continue; + } + break; + } + } +} diff --git a/src/main/java/coordinate/NotStraight.java b/src/main/java/coordinate/NotStraight.java new file mode 100644 index 00000000..fa01690a --- /dev/null +++ b/src/main/java/coordinate/NotStraight.java @@ -0,0 +1,16 @@ +package coordinate; + +public class NotStraight implements Coordinate { + private final double x1; + private final double y1; + + public NotStraight(String[] split) { + this.x1 = Double.parseDouble(split[0]); + this.y1 = Double.parseDouble(split[1]); + } + + @Override + public void printSpecialCharacter() { + System.out.println("좌표는(" + this.x1 +"," + this.y1 + ")입니다"); + } +} diff --git a/src/main/java/coordinate/Straight.java b/src/main/java/coordinate/Straight.java new file mode 100644 index 00000000..ab3ae53a --- /dev/null +++ b/src/main/java/coordinate/Straight.java @@ -0,0 +1,27 @@ +package coordinate; + +public class Straight implements Coordinate { + private final double x1; + private final double x2; + private final double y1; + private final double y2; + private final double sqrt; + + public Straight(String[] split) { + this.x1 = Double.parseDouble(split[0]); + this.y1 = Double.parseDouble(split[1]); + this.x2 = Double.parseDouble(split[2]); + this.y2 = Double.parseDouble(split[3]); + this.sqrt = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); + } + + public double getSqrt() { + return this.sqrt; + } + + @Override + public void printSpecialCharacter() { + System.out.println("좌표는(" + this.x1 +"," + this.y1 + ")-(" + this.x2 + "," + this.y2 + ")입니다." ); + System.out.println("두점 사이의 거리는" + this.sqrt); + } +} From ec07a918977a444016126799274aeb799671e278 Mon Sep 17 00:00:00 2001 From: "https://github.com/youngreal" Date: Fri, 15 Jul 2022 14:50:50 +0900 Subject: [PATCH 2/4] =?UTF-8?q?test:=20=EC=A2=8C=ED=91=9C=EA=B3=84?= =?UTF-8?q?=EC=82=B0=EA=B8=B0=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/test/java/coordinate/InputTest.java | 54 +++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/test/java/coordinate/InputTest.java diff --git a/src/test/java/coordinate/InputTest.java b/src/test/java/coordinate/InputTest.java new file mode 100644 index 00000000..f6f4dce7 --- /dev/null +++ b/src/test/java/coordinate/InputTest.java @@ -0,0 +1,54 @@ +package coordinate; + +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; +import static org.junit.jupiter.api.Assertions.*; + +class InputTest { + + @ParameterizedTest + @ValueSource(strings = {"(a,b)-(c,d)", "", " ", "가나다라", "가,나,다,라", "a", "10,10-20,40", "(10,30)-", "!@#$", "!,@,#,$", "(ㄱ,ㄴ)-(ㄷ,ㄹ)"}) + @DisplayName("좌표입력 패턴 실패테스트") + void testCoordinatePattern_False(String input) { + assertThrows(IllegalArgumentException.class, () -> { + new InputConverter(input); + }); + } + + @ParameterizedTest + @ValueSource(strings = {"(1,2)-(3,4)", "(10,20)", "(1,2)"}) + @DisplayName("좌표입력 패턴 성공테스트") + void testCoordinatePattern_Success(String input) { + assertDoesNotThrow(() -> new InputConverter(input)); + } + + + @ParameterizedTest + @ValueSource(strings = {"(-1,-2)","(25,26)", "(100,200)-(300,400)"}) + @DisplayName("좌표 범위 실패테스트") + void test(String input) { + assertThrows(IllegalArgumentException.class, () -> { + new InputConverter(input); + }); + } + + @ParameterizedTest + @ValueSource(strings = {"(10,20)", "(24,24)-(1,2)"}) + @DisplayName("좌표 범위 성공테스트") + void test2(String input) { + assertDoesNotThrow(() -> new InputConverter(input)); + } + + @Test + @DisplayName("제곱근 값 테스트") + void test3() { + String[] split = "10,20-3,9".replace("-", ",").split(","); + Straight straight = new Straight(split); + assertThat(straight.getSqrt()).isEqualTo(13.0384, offset(0.0001)); + } +} \ No newline at end of file From 89a83a38ac11022d2ab48bfce1d61b2b5439040b Mon Sep 17 00:00:00 2001 From: "https://github.com/youngreal" Date: Fri, 15 Jul 2022 14:51:17 +0900 Subject: [PATCH 3/4] =?UTF-8?q?docs:=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/coordinate/README.md diff --git a/src/main/java/coordinate/README.md b/src/main/java/coordinate/README.md new file mode 100644 index 00000000..f9477a4e --- /dev/null +++ b/src/main/java/coordinate/README.md @@ -0,0 +1,18 @@ +- X,Y좌표는 모두 최대 24까지만 입력할수있다. (입력범위 초과시 에러문구출력후, 다시입력받음) +- 쉼표로 x,y값을 구분한다 +- 좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. +- 직선인 경우는 두 점 사이 거리를 계산해서 출력한다. +- 정상적인 좌표값을 입력한 경우, 해당 좌표에 특수문자를 표시한다. + + +Main: 예외발생시 계속입력받게한다(책임) Input(협력) + +Input: 좌표를 입력받는다(책임) InputConverter(협력) + +InputConverter: 좌표형식의 패턴,수의 범위를 검증한다(책임) CoordinateFactory(협력) + +CoordinateFactory: 직선인지 아닌지 체크하고 좌표를 출력한다(책임) Coordinate(협력) + +Coordinate: 좌표의 개수에 따라 구현 클래스가 달라지는 인터페이스 +Straight: 좌표의개수가 2개인경우 좌표출력 + 제곱근값출력 +NotStraight: 좌표의개수가 1개인경우 좌표출력 \ No newline at end of file From 75d67229577daeec71fb119d27f55fe069bb4eb4 Mon Sep 17 00:00:00 2001 From: "https://github.com/youngreal" Date: Fri, 15 Jul 2022 15:36:17 +0900 Subject: [PATCH 4/4] =?UTF-8?q?refactor:=20=ED=98=91=EB=A0=A5=EA=B4=80?= =?UTF-8?q?=EA=B3=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/Input.java | 3 ++- src/main/java/coordinate/InputConverter.java | 9 ++------- src/main/java/coordinate/README.md | 5 +++-- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/coordinate/Input.java b/src/main/java/coordinate/Input.java index 48115dc6..66deb73c 100644 --- a/src/main/java/coordinate/Input.java +++ b/src/main/java/coordinate/Input.java @@ -12,6 +12,7 @@ public void inputCoordinate() throws IllegalArgumentException{ private void validInput(String line) { InputConverter inputConverter = new InputConverter(line); - inputConverter.something(); + CoordinateFactory factory = new CoordinateFactory(); + factory.checkStraight(inputConverter.deleteParentheses(line)); } } diff --git a/src/main/java/coordinate/InputConverter.java b/src/main/java/coordinate/InputConverter.java index 47a83b39..467cac80 100644 --- a/src/main/java/coordinate/InputConverter.java +++ b/src/main/java/coordinate/InputConverter.java @@ -14,9 +14,8 @@ public InputConverter(String inputCoordinate) { validateCoordinateRange(); } - public void something() { - CoordinateFactory factory = new CoordinateFactory(); - factory.checkStraight(this.inputCoordinate); + public String deleteParentheses(String inputCoordinate) { + return inputCoordinate.replaceAll("[^0-9,-]*", ""); } private boolean isNotMatchPattern(String inputCoordinate) { @@ -49,8 +48,4 @@ private void checkMaxRange(String input) { private boolean isOverThanMaxRange(String tempLine) { return Integer.parseInt(tempLine) > 24; } - - private String deleteParentheses(String inputCoordinate) { - return inputCoordinate.replaceAll("[^0-9,-]*", ""); - } } diff --git a/src/main/java/coordinate/README.md b/src/main/java/coordinate/README.md index f9477a4e..410d174f 100644 --- a/src/main/java/coordinate/README.md +++ b/src/main/java/coordinate/README.md @@ -7,9 +7,10 @@ Main: 예외발생시 계속입력받게한다(책임) Input(협력) -Input: 좌표를 입력받는다(책임) InputConverter(협력) +Input: 좌표를 입력받는다(책임) InputConverter(협력), CoordinateFactory(협력) -InputConverter: 좌표형식의 패턴,수의 범위를 검증한다(책임) CoordinateFactory(협력) +InputConverter: 좌표 입력받을때마다 생성자에서 좌표형식의 패턴,수의 범위를 검증한다. +패턴의 괄호를제거한다(책임) CoordinateFactory: 직선인지 아닌지 체크하고 좌표를 출력한다(책임) Coordinate(협력)