From 447b6b45af3f29a53a15053c67dafd6c8349fa8d Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 9 Nov 2021 15:14:32 +0900 Subject: [PATCH 01/37] =?UTF-8?q?feat=20:=20RentCompany=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/rentcar/domain/RentCompanyTest.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/test/java/rentcar/domain/RentCompanyTest.java diff --git a/src/test/java/rentcar/domain/RentCompanyTest.java b/src/test/java/rentcar/domain/RentCompanyTest.java new file mode 100644 index 00000000..32a030ed --- /dev/null +++ b/src/test/java/rentcar/domain/RentCompanyTest.java @@ -0,0 +1,33 @@ +package rentcar.domain; + +import org.junit.jupiter.api.Test; +import rentcar.domain.car.Avante; +import rentcar.domain.car.Car; +import rentcar.domain.car.K5; +import rentcar.domain.car.Sonata; + +import static org.assertj.core.api.Assertions.assertThat; + +class RentCompanyTest { + private static final String NEWLINE = System.getProperty("line.separator"); + + @Test + void report() { + RentCompany company = RentCompany.create(); + Car car = new Sonata(150); + company.addCar(new Sonata(150)); + company.addCar(new K5(260)); + company.addCar(new Sonata(120)); + company.addCar(new Avante(300)); + company.addCar(new K5(390)); + + String report = company.generateReport(); + assertThat(report).isEqualTo( + "Sonata : 15리터" + NEWLINE + + "K5 : 20리터" + NEWLINE + + "Sonata : 12리터" + NEWLINE + + "Avante : 20리터" + NEWLINE + + "K5 : 30리터" + NEWLINE + ); + } +} From 8c685fa1d6fc97491e5f4fc6c6806948f4169c90 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 9 Nov 2021 15:15:33 +0900 Subject: [PATCH 02/37] =?UTF-8?q?feat=20:=20DistancePerLiter,=20TripDistan?= =?UTF-8?q?ce=20VO=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/car/vo/DistancePerLiter.java | 21 +++++++++++++++++++ .../rentcar/domain/car/vo/TripDistance.java | 21 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/main/java/rentcar/domain/car/vo/DistancePerLiter.java create mode 100644 src/main/java/rentcar/domain/car/vo/TripDistance.java diff --git a/src/main/java/rentcar/domain/car/vo/DistancePerLiter.java b/src/main/java/rentcar/domain/car/vo/DistancePerLiter.java new file mode 100644 index 00000000..de80eea0 --- /dev/null +++ b/src/main/java/rentcar/domain/car/vo/DistancePerLiter.java @@ -0,0 +1,21 @@ +package rentcar.domain.car.vo; + +public class DistancePerLiter { + + private final double value; + + public DistancePerLiter(final double value) { + validateGreaterThanZero(value); + this.value = value; + } + + private void validateGreaterThanZero(final double value) { + if (value <= 0) { + throw new IllegalArgumentException("0 초과의 수 여야 합니다"); + } + } + + public double getValue() { + return value; + } +} diff --git a/src/main/java/rentcar/domain/car/vo/TripDistance.java b/src/main/java/rentcar/domain/car/vo/TripDistance.java new file mode 100644 index 00000000..056450e6 --- /dev/null +++ b/src/main/java/rentcar/domain/car/vo/TripDistance.java @@ -0,0 +1,21 @@ +package rentcar.domain.car.vo; + +public class TripDistance { + + private final double value; + + public TripDistance(final double value) { + validateZeroOrMore(value); + this.value = value; + } + + private void validateZeroOrMore(final double value) { + if (value < 0) { + throw new IllegalArgumentException("0 이상의 수어야 합니다"); + } + } + + public double getValue() { + return value; + } +} From 18d2b37c0cd845530a9fbd3addeda68825a0c835 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 9 Nov 2021 15:17:00 +0900 Subject: [PATCH 03/37] =?UTF-8?q?feat=20:=20Car=20=EC=B6=94=EC=83=81=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=B0=8F=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=EC=B2=B4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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/rentcar/domain/car/Avante.java | 40 ++++++++++++++++++++ src/main/java/rentcar/domain/car/Car.java | 14 +++++++ src/main/java/rentcar/domain/car/K5.java | 40 ++++++++++++++++++++ src/main/java/rentcar/domain/car/Sonata.java | 40 ++++++++++++++++++++ 4 files changed, 134 insertions(+) create mode 100644 src/main/java/rentcar/domain/car/Avante.java create mode 100644 src/main/java/rentcar/domain/car/Car.java create mode 100644 src/main/java/rentcar/domain/car/K5.java create mode 100644 src/main/java/rentcar/domain/car/Sonata.java diff --git a/src/main/java/rentcar/domain/car/Avante.java b/src/main/java/rentcar/domain/car/Avante.java new file mode 100644 index 00000000..32c04380 --- /dev/null +++ b/src/main/java/rentcar/domain/car/Avante.java @@ -0,0 +1,40 @@ +package rentcar.domain.car; + +import rentcar.domain.car.vo.DistancePerLiter; +import rentcar.domain.car.vo.TripDistance; + +public class Avante extends Car{ + + private static final double DISTANCE_PER_LITER = 15; + + private final TripDistance tripDistance; + private final DistancePerLiter distancePerLiter; + + public Avante(final TripDistance tripDistance, final DistancePerLiter distancePerLiter) { + this.tripDistance = tripDistance; + this.distancePerLiter = distancePerLiter; + } + + public Avante(final double tripDistance, final double distancePerLiter) { + this(new TripDistance(tripDistance), new DistancePerLiter(distancePerLiter)); + } + + public Avante(final double tripDistance) { + this(tripDistance, DISTANCE_PER_LITER); + } + + @Override + public double getDistancePerLiter() { + return distancePerLiter.getValue(); + } + + @Override + public double getTripDistance() { + return tripDistance.getValue(); + } + + @Override + public String getName() { + return "Avante"; + } +} diff --git a/src/main/java/rentcar/domain/car/Car.java b/src/main/java/rentcar/domain/car/Car.java new file mode 100644 index 00000000..c1226f6f --- /dev/null +++ b/src/main/java/rentcar/domain/car/Car.java @@ -0,0 +1,14 @@ +package rentcar.domain.car; + +public abstract class Car { + + protected abstract double getDistancePerLiter(); + + protected abstract double getTripDistance(); + + public abstract String getName(); + + public double getChargeQuantity() { + return getTripDistance() / getDistancePerLiter(); + } +} diff --git a/src/main/java/rentcar/domain/car/K5.java b/src/main/java/rentcar/domain/car/K5.java new file mode 100644 index 00000000..bdb339a2 --- /dev/null +++ b/src/main/java/rentcar/domain/car/K5.java @@ -0,0 +1,40 @@ +package rentcar.domain.car; + +import rentcar.domain.car.vo.DistancePerLiter; +import rentcar.domain.car.vo.TripDistance; + +public class K5 extends Car { + + private static final double DISTANCE_PER_LITER = 13; + + private final TripDistance tripDistance; + private final DistancePerLiter distancePerLiter; + + public K5(final TripDistance tripDistance, final DistancePerLiter distancePerLiter) { + this.tripDistance = tripDistance; + this.distancePerLiter = distancePerLiter; + } + + public K5(final double tripDistance, final double distancePerLiter) { + this(new TripDistance(tripDistance), new DistancePerLiter(distancePerLiter)); + } + + public K5(final double tripDistance) { + this(tripDistance, DISTANCE_PER_LITER); + } + + @Override + protected double getDistancePerLiter() { + return distancePerLiter.getValue(); + } + + @Override + protected double getTripDistance() { + return tripDistance.getValue(); + } + + @Override + public String getName() { + return "K5"; + } +} diff --git a/src/main/java/rentcar/domain/car/Sonata.java b/src/main/java/rentcar/domain/car/Sonata.java new file mode 100644 index 00000000..91e8ec26 --- /dev/null +++ b/src/main/java/rentcar/domain/car/Sonata.java @@ -0,0 +1,40 @@ +package rentcar.domain.car; + +import rentcar.domain.car.vo.DistancePerLiter; +import rentcar.domain.car.vo.TripDistance; + +public class Sonata extends Car { + + private static final int DISTANCE_PER_LITER = 10; + + private final TripDistance tripDistance; + private final DistancePerLiter distancePerLiter; + + public Sonata(final TripDistance tripDistance, final DistancePerLiter distancePerLiter) { + this.tripDistance = tripDistance; + this.distancePerLiter = distancePerLiter; + } + + public Sonata(final double tripDistance, final double distancePerLiter) { + this(new TripDistance(tripDistance), new DistancePerLiter(distancePerLiter)); + } + + public Sonata(final double tripDistance) { + this(tripDistance, DISTANCE_PER_LITER); + } + + @Override + protected double getDistancePerLiter() { + return distancePerLiter.getValue(); + } + + @Override + protected double getTripDistance() { + return tripDistance.getValue(); + } + + @Override + public String getName() { + return "Sonata"; + } +} From d09679fe750308dd1bedd2cc20ee16dd0b4f4d10 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 9 Nov 2021 15:17:25 +0900 Subject: [PATCH 04/37] =?UTF-8?q?feat=20:=20RentCompany=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/rentcar/domain/RentCompany.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/main/java/rentcar/domain/RentCompany.java diff --git a/src/main/java/rentcar/domain/RentCompany.java b/src/main/java/rentcar/domain/RentCompany.java new file mode 100644 index 00000000..6b3be59d --- /dev/null +++ b/src/main/java/rentcar/domain/RentCompany.java @@ -0,0 +1,41 @@ +package rentcar.domain; + +import rentcar.domain.car.Car; + +import java.util.ArrayList; +import java.util.List; + +public class RentCompany { + + private static final String NEWLINE = System.getProperty("line.separator"); + private static final String DELIMITER = " : "; + private static final String LITER = "리터"; + + List cars; + + private RentCompany(final List cars) { + this.cars = cars; + } + + public static RentCompany create() { + return new RentCompany(new ArrayList<>()); + } + + public void addCar(final Car car) { + cars.add(car); + } + + public String generateReport() { + StringBuilder report = new StringBuilder(); + + for (Car car : cars) { + report.append(car.getName()); + report.append(DELIMITER); + report.append((int) car.getChargeQuantity()); + report.append(LITER); + report.append(NEWLINE); + } + + return report.toString(); + } +} From 2ae061cb3c74464b7d5c3ff09a9c6b8f730e2e3c Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 9 Nov 2021 16:14:25 +0900 Subject: [PATCH 05/37] =?UTF-8?q?feat=20:=20X=EC=A2=8C=ED=91=9C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=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/domain/vo/X.java | 35 +++++++++++++++++++ src/test/java/coordinate/domain/vo/XTest.java | 34 ++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/main/java/coordinate/domain/vo/X.java create mode 100644 src/test/java/coordinate/domain/vo/XTest.java diff --git a/src/main/java/coordinate/domain/vo/X.java b/src/main/java/coordinate/domain/vo/X.java new file mode 100644 index 00000000..2c4b4dd8 --- /dev/null +++ b/src/main/java/coordinate/domain/vo/X.java @@ -0,0 +1,35 @@ +package coordinate.domain.vo; + +import java.util.Objects; + +public class X { + + private static final int MIN_X_VALUE = 0; + private static final int MAX_X_VALUE = 24; + + private final int value; + + public X(final int value) { + validateOutOfRange(value); + this.value = value; + } + + private void validateOutOfRange(final int value) { + if (value < MIN_X_VALUE || value > MAX_X_VALUE) { + throw new IllegalArgumentException("x값은 0이상 24이하여야 합니다"); + } + } + + @Override + public boolean equals(final Object object) { + if (this == object) return true; + if (!(object instanceof X)) return false; + final X x = (X) object; + return value == x.value; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } +} diff --git a/src/test/java/coordinate/domain/vo/XTest.java b/src/test/java/coordinate/domain/vo/XTest.java new file mode 100644 index 00000000..a7342a90 --- /dev/null +++ b/src/test/java/coordinate/domain/vo/XTest.java @@ -0,0 +1,34 @@ +package coordinate.domain.vo; + +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.assertThatIllegalArgumentException; + +class XTest { + + @Test + @DisplayName("x값을 생성한다") + void create() { + //given + int value = 0; + + //when + X x = new X(value); + + //then + assertThat(x).isEqualTo(new X(value)); + } + + @ParameterizedTest + @ValueSource(ints = {-1, 25}) + @DisplayName("0미만 24초과의 값은 예외를 발생시킨다") + void create_throw_exception_with_out_of_range(final int outOfRangeValue) { + //then + assertThatIllegalArgumentException().isThrownBy(() -> new X(outOfRangeValue)) + .withMessageContaining("x값은 0이상 24이하여야 합니다"); + } +} From cf77972ab8a020aea1a7211a768c4194e00500f5 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 9 Nov 2021 16:14:37 +0900 Subject: [PATCH 06/37] =?UTF-8?q?feat=20:=20Y=EC=A2=8C=ED=91=9C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=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/domain/vo/Y.java | 35 +++++++++++++++++++ src/test/java/coordinate/domain/vo/YTest.java | 34 ++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/main/java/coordinate/domain/vo/Y.java create mode 100644 src/test/java/coordinate/domain/vo/YTest.java diff --git a/src/main/java/coordinate/domain/vo/Y.java b/src/main/java/coordinate/domain/vo/Y.java new file mode 100644 index 00000000..89833fe6 --- /dev/null +++ b/src/main/java/coordinate/domain/vo/Y.java @@ -0,0 +1,35 @@ +package coordinate.domain.vo; + +import java.util.Objects; + +public class Y { + + private static final int MIN_Y_VALUE = 0; + private static final int MAX_Y_VALUE = 24; + + private final int value; + + public Y(final int value) { + validateOutOfRange(value); + this.value = value; + } + + private void validateOutOfRange(final int value) { + if (value < MIN_Y_VALUE || value > MAX_Y_VALUE) { + throw new IllegalArgumentException("y값은 0이상 24이하여야 합니다"); + } + } + + @Override + public boolean equals(final Object object) { + if (this == object) return true; + if (!(object instanceof Y)) return false; + final Y y = (Y) object; + return value == y.value; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } +} diff --git a/src/test/java/coordinate/domain/vo/YTest.java b/src/test/java/coordinate/domain/vo/YTest.java new file mode 100644 index 00000000..1e229ae8 --- /dev/null +++ b/src/test/java/coordinate/domain/vo/YTest.java @@ -0,0 +1,34 @@ +package coordinate.domain.vo; + +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.assertThatIllegalArgumentException; + +class YTest { + + @Test + @DisplayName("y값을 생성한다") + void create() { + //given + int value = 0; + + //when + Y y = new Y(value); + + //then + assertThat(y).isEqualTo(new Y(value)); + } + + @ParameterizedTest + @ValueSource(ints = {-1, 25}) + @DisplayName("0미만 24초과의 값은 예외를 발생시킨다") + void create_throw_exception_with_out_of_range_value(final int outOfRangeValue) { + //then + assertThatIllegalArgumentException().isThrownBy(() -> new Y(outOfRangeValue)) + .withMessageContaining("y값은 0이상 24이하여야 합니다"); + } +} From 5d34abc2d1f2bd2aeafe50bb3e752c35a8c411b2 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 9 Nov 2021 16:56:59 +0900 Subject: [PATCH 07/37] =?UTF-8?q?feat=20:=20=EC=A0=90=20=EC=A2=8C=ED=91=9C?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=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/domain/vo/Point.java | 31 +++++++++++++++ .../java/coordinate/domain/vo/PointTest.java | 39 +++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 src/main/java/coordinate/domain/vo/Point.java create mode 100644 src/test/java/coordinate/domain/vo/PointTest.java diff --git a/src/main/java/coordinate/domain/vo/Point.java b/src/main/java/coordinate/domain/vo/Point.java new file mode 100644 index 00000000..c6c182f3 --- /dev/null +++ b/src/main/java/coordinate/domain/vo/Point.java @@ -0,0 +1,31 @@ +package coordinate.domain.vo; + +import java.util.Objects; + +public class Point { + + private final X x; + private final Y y; + + public Point(final X x, final Y y) { + this.x = x; + this.y = y; + } + + public Point(final int x, final int y) { + this(new X(x), new Y(y)); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (!(o instanceof Point)) return false; + final Point point = (Point) o; + return x.equals(point.x) && y.equals(point.y); + } + + @Override + public int hashCode() { + return Objects.hash(x, y); + } +} diff --git a/src/test/java/coordinate/domain/vo/PointTest.java b/src/test/java/coordinate/domain/vo/PointTest.java new file mode 100644 index 00000000..1c734829 --- /dev/null +++ b/src/test/java/coordinate/domain/vo/PointTest.java @@ -0,0 +1,39 @@ +package coordinate.domain.vo; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class PointTest { + + @Test + @DisplayName("X 좌표와 Y 좌표를 입력받아 점을 생성한다") + void create_with_x_and_y() { + //given + int xValue = 0; + int yValue = 0; + + X x = new X(xValue); + Y y = new Y(yValue); + + //when + Point point = new Point(x, y); + + //then + assertThat(point).isEqualTo(new Point(x, y)); + } + @Test + @DisplayName("X 좌표값과 Y 좌표값을 입력받아 점을 생성한다") + void create_with_x_value_and_y_value() { + //given + int xValue = 0; + int yValue = 0; + + //when + Point point = new Point(xValue, yValue); + + //then + assertThat(point).isEqualTo(new Point(xValue, yValue)); + } +} From d1579d65993fc20eb5a4d76d6ac0fa5e21e8f582 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 11 Nov 2021 12:44:51 +0900 Subject: [PATCH 08/37] =?UTF-8?q?feat=20:=20X=20=EA=B0=92=20=EC=82=AC?= =?UTF-8?q?=EC=9D=B4=EC=9D=98=20=EA=B1=B0=EB=A6=AC=EB=A5=BC=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=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/domain/vo/X.java | 10 +++++++++- src/test/java/coordinate/domain/vo/XTest.java | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/main/java/coordinate/domain/vo/X.java b/src/main/java/coordinate/domain/vo/X.java index 2c4b4dd8..ddb5a7d8 100644 --- a/src/main/java/coordinate/domain/vo/X.java +++ b/src/main/java/coordinate/domain/vo/X.java @@ -20,12 +20,20 @@ private void validateOutOfRange(final int value) { } } + public int distance(final X otherX) { + return Math.abs(this.value() - otherX.value()); + } + + private int value() { + return value; + } + @Override public boolean equals(final Object object) { if (this == object) return true; if (!(object instanceof X)) return false; final X x = (X) object; - return value == x.value; + return value() == x.value(); } @Override diff --git a/src/test/java/coordinate/domain/vo/XTest.java b/src/test/java/coordinate/domain/vo/XTest.java index a7342a90..d80012a2 100644 --- a/src/test/java/coordinate/domain/vo/XTest.java +++ b/src/test/java/coordinate/domain/vo/XTest.java @@ -31,4 +31,21 @@ void create_throw_exception_with_out_of_range(final int outOfRangeValue) { assertThatIllegalArgumentException().isThrownBy(() -> new X(outOfRangeValue)) .withMessageContaining("x값은 0이상 24이하여야 합니다"); } + + @Test + @DisplayName("다른 X의 값과 거리를 반환한다") + void distance() { + //given + int value = 1; + X x = new X(value); + + int otherValue = 2; + X otherX = new X(otherValue); + + //when + int distance = x.distance(otherX); + + //then + assertThat(distance).isEqualTo(1); + } } From e30f68d7b9388a29237842a7e133e4829c738d8e Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 11 Nov 2021 12:49:58 +0900 Subject: [PATCH 09/37] =?UTF-8?q?feat=20:=20Y=20=EA=B0=92=20=EC=82=AC?= =?UTF-8?q?=EC=9D=B4=EC=9D=98=20=EA=B1=B0=EB=A6=AC=EB=A5=BC=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=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/domain/vo/Y.java | 8 ++++++++ src/test/java/coordinate/domain/vo/YTest.java | 17 +++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/main/java/coordinate/domain/vo/Y.java b/src/main/java/coordinate/domain/vo/Y.java index 89833fe6..dccb8e95 100644 --- a/src/main/java/coordinate/domain/vo/Y.java +++ b/src/main/java/coordinate/domain/vo/Y.java @@ -20,6 +20,14 @@ private void validateOutOfRange(final int value) { } } + public int distance(final Y otherY) { + return this.value() - otherY.value(); + } + + private int value() { + return value; + } + @Override public boolean equals(final Object object) { if (this == object) return true; diff --git a/src/test/java/coordinate/domain/vo/YTest.java b/src/test/java/coordinate/domain/vo/YTest.java index 1e229ae8..4870166e 100644 --- a/src/test/java/coordinate/domain/vo/YTest.java +++ b/src/test/java/coordinate/domain/vo/YTest.java @@ -31,4 +31,21 @@ void create_throw_exception_with_out_of_range_value(final int outOfRangeValue) { assertThatIllegalArgumentException().isThrownBy(() -> new Y(outOfRangeValue)) .withMessageContaining("y값은 0이상 24이하여야 합니다"); } + + @Test + @DisplayName("다른 Y 값과의 거리를 반환한다") + void distance() { + //given + int value = 1; + Y y = new Y(value); + + int otherValue = 0; + Y otherY = new Y(otherValue); + + //when + int distance = y.distance(otherY); + + //then + assertThat(distance).isEqualTo(1); + } } From 28767e4f71b106117d8f86593f50a076ada67721 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 11 Nov 2021 13:08:26 +0900 Subject: [PATCH 10/37] =?UTF-8?q?feat=20:=20=EB=91=90=20=EC=A0=90=20?= =?UTF-8?q?=EC=82=AC=EC=9D=B4=EC=9D=98=20=EA=B1=B0=EB=A6=AC=EB=A5=BC=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=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/domain/vo/Point.java | 17 +++++++++++++++++ .../java/coordinate/domain/vo/PointTest.java | 16 ++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/main/java/coordinate/domain/vo/Point.java b/src/main/java/coordinate/domain/vo/Point.java index c6c182f3..bf8512e3 100644 --- a/src/main/java/coordinate/domain/vo/Point.java +++ b/src/main/java/coordinate/domain/vo/Point.java @@ -4,6 +4,8 @@ public class Point { + private static final int EXPONENT = 2; + private final X x; private final Y y; @@ -16,6 +18,21 @@ public Point(final int x, final int y) { this(new X(x), new Y(y)); } + public double distance(final Point otherPoint) { + int xDistance = x().distance(otherPoint.x()); + int yDistance = y().distance(otherPoint.y()); + + return Math.sqrt(Math.pow(xDistance, EXPONENT) + Math.pow(yDistance, EXPONENT)); + } + + private X x() { + return x; + } + + private Y y() { + return y; + } + @Override public boolean equals(final Object o) { if (this == o) return true; diff --git a/src/test/java/coordinate/domain/vo/PointTest.java b/src/test/java/coordinate/domain/vo/PointTest.java index 1c734829..4afb13e4 100644 --- a/src/test/java/coordinate/domain/vo/PointTest.java +++ b/src/test/java/coordinate/domain/vo/PointTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.offset; class PointTest { @@ -23,6 +24,7 @@ void create_with_x_and_y() { //then assertThat(point).isEqualTo(new Point(x, y)); } + @Test @DisplayName("X 좌표값과 Y 좌표값을 입력받아 점을 생성한다") void create_with_x_value_and_y_value() { @@ -36,4 +38,18 @@ void create_with_x_value_and_y_value() { //then assertThat(point).isEqualTo(new Point(xValue, yValue)); } + + @Test + @DisplayName("두 점 사이의 거리를 반환한다") + void distance() { + //given + Point point = new Point(0, 0); + Point otherPoint = new Point(1, 1); + + //when + double distance = point.distance(otherPoint); + + //then + assertThat(distance).isEqualTo(1.414, offset(0.001)); + } } From d9454dfa4ec39562ce7767363c9bb90b9584d036 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 11 Nov 2021 13:47:11 +0900 Subject: [PATCH 11/37] =?UTF-8?q?feat=20:=20=EC=84=A0=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=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/domain/Line.java | 5 ++++ .../java/coordinate/domain/StraightLine.java | 19 +++++++++++++++ .../coordinate/domain/StraightLineTest.java | 24 +++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 src/main/java/coordinate/domain/Line.java create mode 100644 src/main/java/coordinate/domain/StraightLine.java create mode 100644 src/test/java/coordinate/domain/StraightLineTest.java diff --git a/src/main/java/coordinate/domain/Line.java b/src/main/java/coordinate/domain/Line.java new file mode 100644 index 00000000..ce74817d --- /dev/null +++ b/src/main/java/coordinate/domain/Line.java @@ -0,0 +1,5 @@ +package coordinate.domain; + +public interface Line { + double length(); +} diff --git a/src/main/java/coordinate/domain/StraightLine.java b/src/main/java/coordinate/domain/StraightLine.java new file mode 100644 index 00000000..ebf69a0e --- /dev/null +++ b/src/main/java/coordinate/domain/StraightLine.java @@ -0,0 +1,19 @@ +package coordinate.domain; + +import coordinate.domain.vo.Point; + +public class StraightLine implements Line { + + private final Point firstPoint; + private final Point secondPoint; + + public StraightLine(final Point firstPoint, final Point secondPoint) { + this.firstPoint = firstPoint; + this.secondPoint = secondPoint; + } + + @Override + public double length() { + return firstPoint.distance(secondPoint); + } +} diff --git a/src/test/java/coordinate/domain/StraightLineTest.java b/src/test/java/coordinate/domain/StraightLineTest.java new file mode 100644 index 00000000..3116053b --- /dev/null +++ b/src/test/java/coordinate/domain/StraightLineTest.java @@ -0,0 +1,24 @@ +package coordinate.domain; + +import coordinate.domain.vo.Point; +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.offset; +import static org.junit.jupiter.api.Assertions.*; + +class StraightLineTest { + + @Test + @DisplayName("선의 길이를 반환한다") + void length() { + Point firstPoint = new Point(0, 0); + Point secondPoint = new Point(1, 1); + Line line = new StraightLine(firstPoint, secondPoint); + + double length = line.length(); + + assertThat(length).isEqualTo(1.414, offset(0.001)); + } +} From 1a87481a664693a6fef2d0482003f580818cee24 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 11 Nov 2021 18:16:35 +0900 Subject: [PATCH 12/37] =?UTF-8?q?feat=20:=20X,=20Y=EB=A5=BC=20=EC=A2=8C?= =?UTF-8?q?=ED=91=9C=EA=B0=92=EC=9C=BC=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=EC=A4=91=EB=B3=B5=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/vo/{X.java => Coordinate.java} | 19 +++---- src/main/java/coordinate/domain/vo/Point.java | 12 ++--- src/main/java/coordinate/domain/vo/Y.java | 43 ---------------- .../vo/{XTest.java => CoordinateTest.java} | 16 +++--- .../java/coordinate/domain/vo/PointTest.java | 4 +- src/test/java/coordinate/domain/vo/YTest.java | 51 ------------------- 6 files changed, 26 insertions(+), 119 deletions(-) rename src/main/java/coordinate/domain/vo/{X.java => Coordinate.java} (61%) delete mode 100644 src/main/java/coordinate/domain/vo/Y.java rename src/test/java/coordinate/domain/vo/{XTest.java => CoordinateTest.java} (76%) delete mode 100644 src/test/java/coordinate/domain/vo/YTest.java diff --git a/src/main/java/coordinate/domain/vo/X.java b/src/main/java/coordinate/domain/vo/Coordinate.java similarity index 61% rename from src/main/java/coordinate/domain/vo/X.java rename to src/main/java/coordinate/domain/vo/Coordinate.java index ddb5a7d8..35c14e1c 100644 --- a/src/main/java/coordinate/domain/vo/X.java +++ b/src/main/java/coordinate/domain/vo/Coordinate.java @@ -2,14 +2,15 @@ import java.util.Objects; -public class X { +public class Coordinate { + private static final int MIN_X_VALUE = 0; private static final int MAX_X_VALUE = 24; private final int value; - public X(final int value) { + public Coordinate(final int value) { validateOutOfRange(value); this.value = value; } @@ -20,8 +21,8 @@ private void validateOutOfRange(final int value) { } } - public int distance(final X otherX) { - return Math.abs(this.value() - otherX.value()); + public int distance(final Coordinate other) { + return Math.abs(this.value() - other.value()); } private int value() { @@ -29,11 +30,11 @@ private int value() { } @Override - public boolean equals(final Object object) { - if (this == object) return true; - if (!(object instanceof X)) return false; - final X x = (X) object; - return value() == x.value(); + public boolean equals(final Object o) { + if (this == o) return true; + if (!(o instanceof Coordinate)) return false; + final Coordinate that = (Coordinate) o; + return value() == that.value(); } @Override diff --git a/src/main/java/coordinate/domain/vo/Point.java b/src/main/java/coordinate/domain/vo/Point.java index bf8512e3..729ea228 100644 --- a/src/main/java/coordinate/domain/vo/Point.java +++ b/src/main/java/coordinate/domain/vo/Point.java @@ -6,16 +6,16 @@ public class Point { private static final int EXPONENT = 2; - private final X x; - private final Y y; + private final Coordinate x; + private final Coordinate y; - public Point(final X x, final Y y) { + public Point(final Coordinate x, final Coordinate y) { this.x = x; this.y = y; } public Point(final int x, final int y) { - this(new X(x), new Y(y)); + this(new Coordinate(x), new Coordinate(y)); } public double distance(final Point otherPoint) { @@ -25,11 +25,11 @@ public double distance(final Point otherPoint) { return Math.sqrt(Math.pow(xDistance, EXPONENT) + Math.pow(yDistance, EXPONENT)); } - private X x() { + private Coordinate x() { return x; } - private Y y() { + private Coordinate y() { return y; } diff --git a/src/main/java/coordinate/domain/vo/Y.java b/src/main/java/coordinate/domain/vo/Y.java deleted file mode 100644 index dccb8e95..00000000 --- a/src/main/java/coordinate/domain/vo/Y.java +++ /dev/null @@ -1,43 +0,0 @@ -package coordinate.domain.vo; - -import java.util.Objects; - -public class Y { - - private static final int MIN_Y_VALUE = 0; - private static final int MAX_Y_VALUE = 24; - - private final int value; - - public Y(final int value) { - validateOutOfRange(value); - this.value = value; - } - - private void validateOutOfRange(final int value) { - if (value < MIN_Y_VALUE || value > MAX_Y_VALUE) { - throw new IllegalArgumentException("y값은 0이상 24이하여야 합니다"); - } - } - - public int distance(final Y otherY) { - return this.value() - otherY.value(); - } - - private int value() { - return value; - } - - @Override - public boolean equals(final Object object) { - if (this == object) return true; - if (!(object instanceof Y)) return false; - final Y y = (Y) object; - return value == y.value; - } - - @Override - public int hashCode() { - return Objects.hash(value); - } -} diff --git a/src/test/java/coordinate/domain/vo/XTest.java b/src/test/java/coordinate/domain/vo/CoordinateTest.java similarity index 76% rename from src/test/java/coordinate/domain/vo/XTest.java rename to src/test/java/coordinate/domain/vo/CoordinateTest.java index d80012a2..c390e972 100644 --- a/src/test/java/coordinate/domain/vo/XTest.java +++ b/src/test/java/coordinate/domain/vo/CoordinateTest.java @@ -8,7 +8,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; -class XTest { +class CoordinateTest { @Test @DisplayName("x값을 생성한다") @@ -17,18 +17,18 @@ void create() { int value = 0; //when - X x = new X(value); + Coordinate coordinate = new Coordinate(value); //then - assertThat(x).isEqualTo(new X(value)); + assertThat(coordinate).isEqualTo(new Coordinate(value)); } - + @ParameterizedTest @ValueSource(ints = {-1, 25}) @DisplayName("0미만 24초과의 값은 예외를 발생시킨다") void create_throw_exception_with_out_of_range(final int outOfRangeValue) { //then - assertThatIllegalArgumentException().isThrownBy(() -> new X(outOfRangeValue)) + assertThatIllegalArgumentException().isThrownBy(() -> new Coordinate(outOfRangeValue)) .withMessageContaining("x값은 0이상 24이하여야 합니다"); } @@ -37,13 +37,13 @@ void create_throw_exception_with_out_of_range(final int outOfRangeValue) { void distance() { //given int value = 1; - X x = new X(value); + Coordinate coordinate = new Coordinate(value); int otherValue = 2; - X otherX = new X(otherValue); + Coordinate otherCoordinate = new Coordinate(otherValue); //when - int distance = x.distance(otherX); + int distance = coordinate.distance(otherCoordinate); //then assertThat(distance).isEqualTo(1); diff --git a/src/test/java/coordinate/domain/vo/PointTest.java b/src/test/java/coordinate/domain/vo/PointTest.java index 4afb13e4..e5a7c1b6 100644 --- a/src/test/java/coordinate/domain/vo/PointTest.java +++ b/src/test/java/coordinate/domain/vo/PointTest.java @@ -15,8 +15,8 @@ void create_with_x_and_y() { int xValue = 0; int yValue = 0; - X x = new X(xValue); - Y y = new Y(yValue); + Coordinate x = new Coordinate(xValue); + Coordinate y = new Coordinate(yValue); //when Point point = new Point(x, y); diff --git a/src/test/java/coordinate/domain/vo/YTest.java b/src/test/java/coordinate/domain/vo/YTest.java deleted file mode 100644 index 4870166e..00000000 --- a/src/test/java/coordinate/domain/vo/YTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package coordinate.domain.vo; - -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.assertThatIllegalArgumentException; - -class YTest { - - @Test - @DisplayName("y값을 생성한다") - void create() { - //given - int value = 0; - - //when - Y y = new Y(value); - - //then - assertThat(y).isEqualTo(new Y(value)); - } - - @ParameterizedTest - @ValueSource(ints = {-1, 25}) - @DisplayName("0미만 24초과의 값은 예외를 발생시킨다") - void create_throw_exception_with_out_of_range_value(final int outOfRangeValue) { - //then - assertThatIllegalArgumentException().isThrownBy(() -> new Y(outOfRangeValue)) - .withMessageContaining("y값은 0이상 24이하여야 합니다"); - } - - @Test - @DisplayName("다른 Y 값과의 거리를 반환한다") - void distance() { - //given - int value = 1; - Y y = new Y(value); - - int otherValue = 0; - Y otherY = new Y(otherValue); - - //when - int distance = y.distance(otherY); - - //then - assertThat(distance).isEqualTo(1); - } -} From b76415a69de4c4c9d528002eaf93a26bbda5aa6d Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 11 Nov 2021 18:41:01 +0900 Subject: [PATCH 13/37] =?UTF-8?q?style=20:=20=EB=AA=85=ED=99=95=ED=95=9C?= =?UTF-8?q?=20=EB=B3=80=EC=88=98=20=EB=AA=85=EC=9C=BC=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/domain/vo/Coordinate.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/coordinate/domain/vo/Coordinate.java b/src/main/java/coordinate/domain/vo/Coordinate.java index 35c14e1c..8f56e061 100644 --- a/src/main/java/coordinate/domain/vo/Coordinate.java +++ b/src/main/java/coordinate/domain/vo/Coordinate.java @@ -5,8 +5,8 @@ public class Coordinate { - private static final int MIN_X_VALUE = 0; - private static final int MAX_X_VALUE = 24; + private static final int MIN_COORDINATE_VALUE = 0; + private static final int MAX_COORDINATE_VALUE = 24; private final int value; @@ -16,8 +16,8 @@ public Coordinate(final int value) { } private void validateOutOfRange(final int value) { - if (value < MIN_X_VALUE || value > MAX_X_VALUE) { - throw new IllegalArgumentException("x값은 0이상 24이하여야 합니다"); + if (value < MIN_COORDINATE_VALUE || value > MAX_COORDINATE_VALUE) { + throw new IllegalArgumentException("좌표 값은 0이상 24이하여야 합니다"); } } From ece1e02061debf5177301cf5f2524ff9e5d96d96 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 11 Nov 2021 18:41:35 +0900 Subject: [PATCH 14/37] =?UTF-8?q?feat=20:=20=EB=8F=84=ED=98=95=20=EC=B6=94?= =?UTF-8?q?=EC=83=81=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coordinate/domain/AbstractFigure.java | 32 ++++++++++++ src/main/java/coordinate/domain/Figure.java | 8 +++ src/main/java/coordinate/domain/Line.java | 1 + .../java/coordinate/domain/StraightLine.java | 30 ++++++++--- .../coordinate/domain/StraightLineTest.java | 52 +++++++++++++++++-- 5 files changed, 112 insertions(+), 11 deletions(-) create mode 100644 src/main/java/coordinate/domain/AbstractFigure.java create mode 100644 src/main/java/coordinate/domain/Figure.java diff --git a/src/main/java/coordinate/domain/AbstractFigure.java b/src/main/java/coordinate/domain/AbstractFigure.java new file mode 100644 index 00000000..41666133 --- /dev/null +++ b/src/main/java/coordinate/domain/AbstractFigure.java @@ -0,0 +1,32 @@ +package coordinate.domain; + +import coordinate.domain.vo.Point; + +import java.util.List; +import java.util.Objects; + +public abstract class AbstractFigure implements Figure { + + protected final List points; + + protected AbstractFigure(final List points) { + this.points = points; + } + + private List points() { + return points; + } + + @Override + public boolean equals(final Object other) { + if (this == other) return true; + if (!(other instanceof AbstractFigure)) return false; + final AbstractFigure figure = (AbstractFigure) other; + return points().equals(figure.points()); + } + + @Override + public int hashCode() { + return Objects.hash(points); + } +} diff --git a/src/main/java/coordinate/domain/Figure.java b/src/main/java/coordinate/domain/Figure.java new file mode 100644 index 00000000..1768cb7b --- /dev/null +++ b/src/main/java/coordinate/domain/Figure.java @@ -0,0 +1,8 @@ +package coordinate.domain; + +public interface Figure { + + double area(); + + boolean equals(final Object other); +} diff --git a/src/main/java/coordinate/domain/Line.java b/src/main/java/coordinate/domain/Line.java index ce74817d..e5a472e1 100644 --- a/src/main/java/coordinate/domain/Line.java +++ b/src/main/java/coordinate/domain/Line.java @@ -1,5 +1,6 @@ package coordinate.domain; +@FunctionalInterface public interface Line { double length(); } diff --git a/src/main/java/coordinate/domain/StraightLine.java b/src/main/java/coordinate/domain/StraightLine.java index ebf69a0e..4ab1ee6b 100644 --- a/src/main/java/coordinate/domain/StraightLine.java +++ b/src/main/java/coordinate/domain/StraightLine.java @@ -2,18 +2,34 @@ import coordinate.domain.vo.Point; -public class StraightLine implements Line { +import java.util.List; - private final Point firstPoint; - private final Point secondPoint; +public class StraightLine extends AbstractFigure implements Line { - public StraightLine(final Point firstPoint, final Point secondPoint) { - this.firstPoint = firstPoint; - this.secondPoint = secondPoint; + private static final int NUMBER_OF_LINE_POINTS = 2; + private static final String INVALID_NUMBER_OF_POINT_ERROR_MESSAGE = "선의 점의 개수는 2개여야 합니다"; + private static final double LINE_AREA = 0; + + public StraightLine(List points) { + super(points); + validateNumberOf(points); + } + + private void validateNumberOf(final List points) { + if (points.size() != NUMBER_OF_LINE_POINTS) { + throw new IllegalArgumentException(INVALID_NUMBER_OF_POINT_ERROR_MESSAGE); + } + } + + @Override + public double area() { + return LINE_AREA; } @Override public double length() { - return firstPoint.distance(secondPoint); + return points.get(0).distance(points.get(1)); } + + } diff --git a/src/test/java/coordinate/domain/StraightLineTest.java b/src/test/java/coordinate/domain/StraightLineTest.java index 3116053b..9cc7675b 100644 --- a/src/test/java/coordinate/domain/StraightLineTest.java +++ b/src/test/java/coordinate/domain/StraightLineTest.java @@ -4,21 +4,65 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.offset; -import static org.junit.jupiter.api.Assertions.*; class StraightLineTest { + @Test + @DisplayName("선을 생성한다") + void create() { + //given + List points = Arrays.asList(new Point(0, 0), new Point(1, 1)); + + //when + Line line = new StraightLine(points); + + //then + assertThat(line).isEqualTo(new StraightLine(points)); + + } + + @Test + @DisplayName("점의 개수가 2개 이상이면 예외를 발생시킨다") + void create_throw_exception_with_invalid_number_of_points() { + //given + List points = Collections.singletonList(new Point(0, 0)); + + //then + assertThatIllegalArgumentException().isThrownBy(() -> new StraightLine(points)) + .withMessageContaining("선의 점의 개수는 2개여야 합니다"); + } + @Test @DisplayName("선의 길이를 반환한다") void length() { - Point firstPoint = new Point(0, 0); - Point secondPoint = new Point(1, 1); - Line line = new StraightLine(firstPoint, secondPoint); + //given + List points = Arrays.asList(new Point(0, 0), new Point(1, 1)); + Line line = new StraightLine(points); + //when double length = line.length(); assertThat(length).isEqualTo(1.414, offset(0.001)); } + + @Test + @DisplayName("선의 넓이를 반환한다") + void area() { + //given + List points = Arrays.asList(new Point(0, 0), new Point(1, 1)); + AbstractFigure figure = new StraightLine(points); + + //when + double area = figure.area(); + + //then + assertThat(area).isZero(); + } } From ec4f5fac96db9f0e1c8dba822f9a94f68226cdcb Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 11 Nov 2021 19:12:11 +0900 Subject: [PATCH 15/37] =?UTF-8?q?refactor=20:=20=EC=A2=8C=ED=91=9C=20?= =?UTF-8?q?=EA=B0=92=20=EC=98=88=EC=99=B8=20=EB=A9=94=EC=84=B8=EC=A7=80=20?= =?UTF-8?q?=EC=88=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/domain/vo/Coordinate.java | 3 ++- src/test/java/coordinate/domain/vo/CoordinateTest.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/coordinate/domain/vo/Coordinate.java b/src/main/java/coordinate/domain/vo/Coordinate.java index 8f56e061..35823895 100644 --- a/src/main/java/coordinate/domain/vo/Coordinate.java +++ b/src/main/java/coordinate/domain/vo/Coordinate.java @@ -7,6 +7,7 @@ public class Coordinate { private static final int MIN_COORDINATE_VALUE = 0; private static final int MAX_COORDINATE_VALUE = 24; + private static final String INVALID_COORDINATE_VALUE_MESSAGE = "좌표 값은 0이상 24이하여야 합니다"; private final int value; @@ -17,7 +18,7 @@ public Coordinate(final int value) { private void validateOutOfRange(final int value) { if (value < MIN_COORDINATE_VALUE || value > MAX_COORDINATE_VALUE) { - throw new IllegalArgumentException("좌표 값은 0이상 24이하여야 합니다"); + throw new IllegalArgumentException(INVALID_COORDINATE_VALUE_MESSAGE); } } diff --git a/src/test/java/coordinate/domain/vo/CoordinateTest.java b/src/test/java/coordinate/domain/vo/CoordinateTest.java index c390e972..7ca51642 100644 --- a/src/test/java/coordinate/domain/vo/CoordinateTest.java +++ b/src/test/java/coordinate/domain/vo/CoordinateTest.java @@ -29,7 +29,7 @@ void create() { void create_throw_exception_with_out_of_range(final int outOfRangeValue) { //then assertThatIllegalArgumentException().isThrownBy(() -> new Coordinate(outOfRangeValue)) - .withMessageContaining("x값은 0이상 24이하여야 합니다"); + .withMessageContaining("좌표 값은 0이상 24이하여야 합니다"); } @Test From bf154e1d04ab7348cd4587dd01a8e200044122e8 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 11 Nov 2021 19:12:50 +0900 Subject: [PATCH 16/37] =?UTF-8?q?feat=20:=20=EC=A2=8C=ED=91=9C=20=EA=B0=92?= =?UTF-8?q?=20=EC=A4=91=EB=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coordinate/domain/AbstractFigure.java | 11 ++++++ .../coordinate/domain/AbstractFigureTest.java | 38 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/test/java/coordinate/domain/AbstractFigureTest.java diff --git a/src/main/java/coordinate/domain/AbstractFigure.java b/src/main/java/coordinate/domain/AbstractFigure.java index 41666133..dc579113 100644 --- a/src/main/java/coordinate/domain/AbstractFigure.java +++ b/src/main/java/coordinate/domain/AbstractFigure.java @@ -2,17 +2,28 @@ import coordinate.domain.vo.Point; +import java.util.HashSet; import java.util.List; import java.util.Objects; public abstract class AbstractFigure implements Figure { + private static final String DUPLICATE_POINTS_MESSAGE = "점들 사이에 중복이 존재합니다"; protected final List points; protected AbstractFigure(final List points) { + validateDuplicateOf(points); this.points = points; } + private void validateDuplicateOf(final List points) { + HashSet set = new HashSet<>(points); + + if (set.size() != points.size()) { + throw new IllegalArgumentException(DUPLICATE_POINTS_MESSAGE); + } + } + private List points() { return points; } diff --git a/src/test/java/coordinate/domain/AbstractFigureTest.java b/src/test/java/coordinate/domain/AbstractFigureTest.java new file mode 100644 index 00000000..19ecbebc --- /dev/null +++ b/src/test/java/coordinate/domain/AbstractFigureTest.java @@ -0,0 +1,38 @@ +package coordinate.domain; + +import coordinate.domain.vo.Point; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +class AbstractFigureTest { + + @Test + @DisplayName("점들을 인자로 받아 도형을 생성한다") + void create() { + //given + List points = Arrays.asList(new Point(0, 0), new Point(1, 1)); + + //when + AbstractFigure figure = new StraightLine(points); + + //then + assertThat(figure).isEqualTo(new StraightLine(points)); + } + + @Test + @DisplayName("점들 중 중복이 존재하면 예외를 발생시킨다") + void create_throw_exception_with_duplicate_points() { + //given + List points = Arrays.asList(new Point(0, 0), new Point(0, 0)); + + //then + assertThatIllegalArgumentException().isThrownBy(() -> new StraightLine(points)) + .withMessage("점들 사이에 중복이 존재합니다"); + } +} From b257cc9c2408b390f647f177b464d6b7eb6ea1cb Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Fri, 12 Nov 2021 19:01:11 +0900 Subject: [PATCH 17/37] =?UTF-8?q?feat=20:=20X,=20Y=20=EC=A2=8C=ED=91=9C=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=A0=91?= =?UTF-8?q?=EA=B7=BC=EC=A0=9C=EC=96=B4=EC=9E=90=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/domain/Figure.java | 4 +-- src/main/java/coordinate/domain/vo/Point.java | 4 +-- .../java/coordinate/domain/vo/PointTest.java | 30 +++++++++++++++++++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/main/java/coordinate/domain/Figure.java b/src/main/java/coordinate/domain/Figure.java index 1768cb7b..2bb8313f 100644 --- a/src/main/java/coordinate/domain/Figure.java +++ b/src/main/java/coordinate/domain/Figure.java @@ -1,8 +1,6 @@ package coordinate.domain; +@FunctionalInterface public interface Figure { - double area(); - - boolean equals(final Object other); } diff --git a/src/main/java/coordinate/domain/vo/Point.java b/src/main/java/coordinate/domain/vo/Point.java index 729ea228..84add14f 100644 --- a/src/main/java/coordinate/domain/vo/Point.java +++ b/src/main/java/coordinate/domain/vo/Point.java @@ -25,11 +25,11 @@ public double distance(final Point otherPoint) { return Math.sqrt(Math.pow(xDistance, EXPONENT) + Math.pow(yDistance, EXPONENT)); } - private Coordinate x() { + public Coordinate x() { return x; } - private Coordinate y() { + public Coordinate y() { return y; } diff --git a/src/test/java/coordinate/domain/vo/PointTest.java b/src/test/java/coordinate/domain/vo/PointTest.java index e5a7c1b6..df00facc 100644 --- a/src/test/java/coordinate/domain/vo/PointTest.java +++ b/src/test/java/coordinate/domain/vo/PointTest.java @@ -52,4 +52,34 @@ void distance() { //then assertThat(distance).isEqualTo(1.414, offset(0.001)); } + + @Test + @DisplayName("x 좌표를 반환한다") + void x() { + //given + int xValue = 1; + int yValue = 1; + Point point = new Point(xValue, yValue); + + //when + Coordinate x = point.x(); + + //then + assertThat(x).isEqualTo(new Coordinate(xValue)); + } + + @Test + @DisplayName("y 좌표를 반환한다") + void y() { + //given + int xValue = 1; + int yValue = 1; + Point point = new Point(xValue, yValue); + + //when + Coordinate y = point.y(); + + //then + assertThat(y).isEqualTo(new Coordinate(yValue)); + } } From a431858edcd1654caaadac8b58d7b75f956a05d9 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Fri, 12 Nov 2021 19:31:16 +0900 Subject: [PATCH 18/37] =?UTF-8?q?feat=20:=20X,=20Y=20=EC=A2=8C=ED=91=9C?= =?UTF-8?q?=EC=9D=98=20=EC=9D=BC=EC=B9=98=20=EC=97=AC=EB=B6=80=EB=A5=BC=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EA=B8=B0=EB=8A=A5=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/domain/vo/Point.java | 8 +++++ .../java/coordinate/domain/vo/PointTest.java | 34 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/main/java/coordinate/domain/vo/Point.java b/src/main/java/coordinate/domain/vo/Point.java index 84add14f..dffd098d 100644 --- a/src/main/java/coordinate/domain/vo/Point.java +++ b/src/main/java/coordinate/domain/vo/Point.java @@ -33,6 +33,14 @@ public Coordinate y() { return y; } + public boolean hasSameXCoordinate(final Point otherPoint) { + return x().equals(otherPoint.x); + } + + public boolean hasSameYCoordinate(final Point otherPoint) { + return y().equals(otherPoint.y()); + } + @Override public boolean equals(final Object o) { if (this == o) return true; diff --git a/src/test/java/coordinate/domain/vo/PointTest.java b/src/test/java/coordinate/domain/vo/PointTest.java index df00facc..4979253d 100644 --- a/src/test/java/coordinate/domain/vo/PointTest.java +++ b/src/test/java/coordinate/domain/vo/PointTest.java @@ -2,6 +2,8 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.offset; @@ -82,4 +84,36 @@ void y() { //then assertThat(y).isEqualTo(new Coordinate(yValue)); } + + @ParameterizedTest + @CsvSource(value = {"1, 1, true", "1, 2, false"}) + @DisplayName("다른 점을 입력받아 같은 같은 X 좌표의 일치 여부를 반환한다") + void hasSameXCoordinate(final int xValue, final int otherXValue, final boolean expected) { + //given + int yValue = 1; + Point point = new Point(xValue, yValue); + Point otherPoint = new Point(otherXValue, yValue); + + //when + boolean actual = point.hasSameXCoordinate(otherPoint); + + //then + assertThat(actual).isEqualTo(expected); + } + + @ParameterizedTest + @CsvSource(value = {"1, 1, true", "1, 2, false"}) + @DisplayName("다른 점을 입력받아 같은 같은 X 좌표의 일치 여부를 반환한다") + void hasSameYCoordinate(final int yValue, final int otherYValue, final boolean expected) { + //given + int xValue = 1; + Point point = new Point(xValue, yValue); + Point otherPoint = new Point(xValue, otherYValue); + + //when + boolean actual = point.hasSameYCoordinate(otherPoint); + + //then + assertThat(actual).isEqualTo(expected); + } } From 3072a0363e540c450e85e5733dc25317045fcc42 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Fri, 12 Nov 2021 22:10:37 +0900 Subject: [PATCH 19/37] =?UTF-8?q?feat=20:=20=EC=82=AC=EA=B0=81=ED=98=95=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/coordinate/domain/Rectangle.java | 75 ++++++++++++++++ .../java/coordinate/domain/RectangleTest.java | 87 +++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 src/main/java/coordinate/domain/Rectangle.java create mode 100644 src/test/java/coordinate/domain/RectangleTest.java diff --git a/src/main/java/coordinate/domain/Rectangle.java b/src/main/java/coordinate/domain/Rectangle.java new file mode 100644 index 00000000..f77bef62 --- /dev/null +++ b/src/main/java/coordinate/domain/Rectangle.java @@ -0,0 +1,75 @@ +package coordinate.domain; + +import coordinate.domain.vo.Coordinate; +import coordinate.domain.vo.Point; + +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class Rectangle extends AbstractFigure { + + private static final int NUMBER_OF_RECTANGLE_POINTS = 4; + private static final int NUMBER_OF_DUPLICATED_COORDINATE = 2; + + private static final String INVALID_NUMBER_OF_RECTANGLE_POINTS = "사각형의 점은 4개여야 합니다"; + private static final String INVALID_RECTANGLE_MESSAGE = "직사각형이 아닙니다"; + + public Rectangle(final List points) { + super(points); + validateNumberOf(points); + validateIsRectangle(points); + } + + private void validateNumberOf(final List points) { + if (points.size() != NUMBER_OF_RECTANGLE_POINTS) { + throw new IllegalArgumentException(INVALID_NUMBER_OF_RECTANGLE_POINTS); + } + } + + private void validateIsRectangle(final List points) { + Set duplicatedRemovedXCoordinate = removeDuplicateCoordinate(points, Point::x); + Set duplicatedRemovedYCoordinate = removeDuplicateCoordinate(points, Point::y); + + if (hasTwo(duplicatedRemovedXCoordinate) && hasTwo(duplicatedRemovedYCoordinate)) { + throw new IllegalArgumentException(INVALID_RECTANGLE_MESSAGE); + } + } + + private Set removeDuplicateCoordinate(final List points, + final Function extractedFunction) { + return points.stream() + .map(extractedFunction) + .collect(Collectors.toSet()); + } + + private boolean hasTwo(final Set duplicatedRemovedCoordinate) { + return duplicatedRemovedCoordinate.size() != NUMBER_OF_DUPLICATED_COORDINATE; + } + + @Override + public double area() { + Point point = points.get(0); + Point sameXCoordinatePoint = getSameCoordinatePoint(point::hasSameXCoordinate); + Point sameYCoordinatePoint = getSameCoordinatePoint(point::hasSameYCoordinate); + + Line width = new StraightLine(Arrays.asList(point, sameXCoordinatePoint)); + Line height = new StraightLine(Arrays.asList(point, sameYCoordinatePoint)); + + return width.length() * height.length(); + } + + private Point getSameCoordinatePoint(final Predicate hasSameCoordinatePredicate) { + int startIndex = 1; + + return IntStream.range(startIndex, points.size()) + .mapToObj(points::get) + .filter(hasSameCoordinatePredicate) + .findAny() + .orElseThrow(() -> new IllegalStateException(INVALID_RECTANGLE_MESSAGE)); + } +} diff --git a/src/test/java/coordinate/domain/RectangleTest.java b/src/test/java/coordinate/domain/RectangleTest.java new file mode 100644 index 00000000..507276df --- /dev/null +++ b/src/test/java/coordinate/domain/RectangleTest.java @@ -0,0 +1,87 @@ +package coordinate.domain; + +import coordinate.domain.vo.Point; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.assertj.core.api.Assertions.offset; +import static org.junit.jupiter.params.provider.Arguments.arguments; + +class RectangleTest { + + @Test + @DisplayName("점 4개를 인자로 받아 점을 생성한다") + void create() { + //given + List points = + Arrays.asList(new Point(0, 0), new Point(1, 1), new Point(0, 1), new Point(1, 0)); + + //when + Rectangle rectangle = new Rectangle(points); + + //then + assertThat(rectangle).isEqualTo(new Rectangle(points)); + } + + @Test + @DisplayName("점이 4개가 아니면 예외를 발생시킨다") + void create_throw_exception_with_invalid_number_of_points() { + //given + List points = Collections.singletonList(new Point(1, 1)); + + //then + assertThatIllegalArgumentException().isThrownBy(() -> new Rectangle(points)) + .withMessage("사각형의 점은 4개여야 합니다"); + } + + @ParameterizedTest + @MethodSource("isNotRectanglePoints") + @DisplayName("직사각형을 이루는 점이 아니라면 예외를 발생시킨다") + void create_throw_exception_with_is_not_rectangle_points(final List points) { + //then + assertThatIllegalArgumentException().isThrownBy(() -> new Rectangle(points)) + .withMessage("직사각형이 아닙니다"); + } + + static Stream isNotRectanglePoints() { + return Stream.of( + arguments( + Arrays.asList( + new Point(0, 0), new Point(1, 0), + new Point(2, 0), new Point(3, 0)), + Arrays.asList( + new Point(0, 0), new Point(0, 1), + new Point(0, 2), new Point(0, 3)), + Arrays.asList( + new Point(0, 0), new Point(1, 0), + new Point(0, 1), new Point(1, 2)), + Arrays.asList( + new Point(0, 0), new Point(1, 1), + new Point(2, 2), new Point(3, 3)))); + } + + @Test + @DisplayName("넓이를 반환한다") + void area() { + //given + List points = + Arrays.asList(new Point(0, 0), new Point(1, 1), new Point(0, 1), new Point(1, 0)); + Rectangle rectangle = new Rectangle(points); + + //when + double area = rectangle.area(); + + //then + assertThat(area).isEqualTo(1, offset(0.001)); + } +} From fb3cb859106bd22295ab1e499ee43d801467aae8 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Fri, 12 Nov 2021 23:13:53 +0900 Subject: [PATCH 20/37] =?UTF-8?q?feat=20:=20=EC=A2=8C=ED=91=9C=20=EC=A0=88?= =?UTF-8?q?=EB=8C=80=20=EC=A6=9D=EA=B0=80=EA=B0=92=EC=9D=84=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=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 --- .../java/coordinate/domain/vo/Coordinate.java | 5 +++++ .../coordinate/domain/vo/CoordinateTest.java | 21 +++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/coordinate/domain/vo/Coordinate.java b/src/main/java/coordinate/domain/vo/Coordinate.java index 35823895..e3aad455 100644 --- a/src/main/java/coordinate/domain/vo/Coordinate.java +++ b/src/main/java/coordinate/domain/vo/Coordinate.java @@ -42,4 +42,9 @@ public boolean equals(final Object o) { public int hashCode() { return Objects.hash(value); } + + public int absoluteIncrementValue(final Coordinate otherCoordinate) { + int increment = value() - otherCoordinate.value(); + return Math.abs(increment); + } } diff --git a/src/test/java/coordinate/domain/vo/CoordinateTest.java b/src/test/java/coordinate/domain/vo/CoordinateTest.java index 7ca51642..72c7daa6 100644 --- a/src/test/java/coordinate/domain/vo/CoordinateTest.java +++ b/src/test/java/coordinate/domain/vo/CoordinateTest.java @@ -11,7 +11,7 @@ class CoordinateTest { @Test - @DisplayName("x값을 생성한다") + @DisplayName("좌표 값을 생성한다") void create() { //given int value = 0; @@ -33,7 +33,7 @@ void create_throw_exception_with_out_of_range(final int outOfRangeValue) { } @Test - @DisplayName("다른 X의 값과 거리를 반환한다") + @DisplayName("다른 좌표값과 거리를 반환한다") void distance() { //given int value = 1; @@ -48,4 +48,21 @@ void distance() { //then assertThat(distance).isEqualTo(1); } + + @Test + @DisplayName("다른 좌표 값과 절대 증가값을 반환한다") + void absoluteIncrementValue() { + //given + int value = 1; + Coordinate coordinate = new Coordinate(value); + + int otherValue = 3; + Coordinate otherCoordinate = new Coordinate(otherValue); + + //when + int absoluteIncrementValue = coordinate.absoluteIncrementValue(otherCoordinate); + + //then + assertThat(absoluteIncrementValue).isEqualTo(2); + } } From c5bb8aa2e0d70eff49d34cfe621d3a9f0e4dd0ba Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Fri, 12 Nov 2021 23:27:32 +0900 Subject: [PATCH 21/37] =?UTF-8?q?feat=20:=20=EC=A0=90=EA=B3=BC=20=EC=A0=90?= =?UTF-8?q?=20=EC=82=AC=EC=9D=B4=EC=9D=98=20=EA=B8=B0=EC=9A=B8=EA=B8=B0?= =?UTF-8?q?=EB=A5=BC=20=EA=B5=AC=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=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/domain/vo/Point.java | 14 +++++++ .../java/coordinate/domain/vo/PointTest.java | 37 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/main/java/coordinate/domain/vo/Point.java b/src/main/java/coordinate/domain/vo/Point.java index dffd098d..cbb31572 100644 --- a/src/main/java/coordinate/domain/vo/Point.java +++ b/src/main/java/coordinate/domain/vo/Point.java @@ -5,6 +5,9 @@ public class Point { private static final int EXPONENT = 2; + private static final int INVALID_X_INCREMENT = 0; + + private static final String INVALID_X_INCREMENT_EXCEPTION_MESSAGE = "x 변화량이 0일 경우 기울기가 무한대가 됩니다"; private final Coordinate x; private final Coordinate y; @@ -41,6 +44,17 @@ public boolean hasSameYCoordinate(final Point otherPoint) { return y().equals(otherPoint.y()); } + public double absoluteSlopeValue(final Point otherPoint) { + double xIncrement = x().absoluteIncrementValue(otherPoint.x()); + double yIncrement = y().absoluteIncrementValue(otherPoint.y()); + + if (xIncrement == INVALID_X_INCREMENT) { + throw new IllegalArgumentException(INVALID_X_INCREMENT_EXCEPTION_MESSAGE); + } + + return yIncrement / xIncrement; + } + @Override public boolean equals(final Object o) { if (this == o) return true; diff --git a/src/test/java/coordinate/domain/vo/PointTest.java b/src/test/java/coordinate/domain/vo/PointTest.java index 4979253d..dd724352 100644 --- a/src/test/java/coordinate/domain/vo/PointTest.java +++ b/src/test/java/coordinate/domain/vo/PointTest.java @@ -6,6 +6,7 @@ import org.junit.jupiter.params.provider.CsvSource; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.offset; class PointTest { @@ -116,4 +117,40 @@ void hasSameYCoordinate(final int yValue, final int otherYValue, final boolean e //then assertThat(actual).isEqualTo(expected); } + + @Test + @DisplayName("다른 점과의 기울기의 절대값을 반환한다") + void absoluteSlopeValue() { + //given + int xValue = 1; + int yValue = 1; + Point point = new Point(xValue, yValue); + + int otherXValue = 4; + int otherYValue = 2; + Point otherPoint = new Point(otherXValue, otherYValue); + + //when + double actual = point.absoluteSlopeValue(otherPoint); + + //then + assertThat(actual).isEqualTo(0.333, offset(0.001)); + } + + @Test + @DisplayName("다른 점과의 기울기의 절대값을 반환한다") + void absoluteSlopeValue_throw_exception_with_not_increase_x_value() { + //given + int xValue = 1; + int yValue = 1; + Point point = new Point(xValue, yValue); + + int otherXValue = 1; + int otherYValue = 2; + Point otherPoint = new Point(otherXValue, otherYValue); + + //then + assertThatIllegalArgumentException().isThrownBy(() -> point.absoluteSlopeValue(otherPoint)) + .withMessage("x 변화량이 0일 경우 기울기가 무한대가 됩니다"); + } } From 24b8383b8445c736f1b8e13ef24eb76b8c384331 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Wed, 17 Nov 2021 22:43:00 +0900 Subject: [PATCH 22/37] =?UTF-8?q?refactor=20:=20=EC=A7=81=EC=84=A0=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EB=8F=84=ED=98=95=20=EC=B6=94?= =?UTF-8?q?=EC=83=81=20=ED=81=B4=EB=9E=98=EC=8A=A4=EC=99=80=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/coordinate/domain/StraightLine.java | 29 ++++++++++++++----- .../coordinate/domain/StraightLineTest.java | 14 --------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/main/java/coordinate/domain/StraightLine.java b/src/main/java/coordinate/domain/StraightLine.java index 4ab1ee6b..af70e412 100644 --- a/src/main/java/coordinate/domain/StraightLine.java +++ b/src/main/java/coordinate/domain/StraightLine.java @@ -3,27 +3,29 @@ import coordinate.domain.vo.Point; import java.util.List; +import java.util.Objects; -public class StraightLine extends AbstractFigure implements Line { +public class StraightLine implements Line { private static final int NUMBER_OF_LINE_POINTS = 2; - private static final String INVALID_NUMBER_OF_POINT_ERROR_MESSAGE = "선의 점의 개수는 2개여야 합니다"; - private static final double LINE_AREA = 0; + + private static final String INVALID_NUMBER_OF_STRAIGHT_LINE_POINTS_EXCEPTION_MESSAGE = "선의 점의 개수는 2개여야 합니다"; + + private final List points; public StraightLine(List points) { - super(points); validateNumberOf(points); + this.points = points; } private void validateNumberOf(final List points) { if (points.size() != NUMBER_OF_LINE_POINTS) { - throw new IllegalArgumentException(INVALID_NUMBER_OF_POINT_ERROR_MESSAGE); + throw new IllegalArgumentException(INVALID_NUMBER_OF_STRAIGHT_LINE_POINTS_EXCEPTION_MESSAGE); } } - @Override - public double area() { - return LINE_AREA; + private List points() { + return points; } @Override @@ -31,5 +33,16 @@ public double length() { return points.get(0).distance(points.get(1)); } + @Override + public boolean equals(final Object other) { + if (this == other) return true; + if (!(other instanceof StraightLine)) return false; + final StraightLine that = (StraightLine) other; + return points().equals(that.points()); + } + @Override + public int hashCode() { + return Objects.hash(points); + } } diff --git a/src/test/java/coordinate/domain/StraightLineTest.java b/src/test/java/coordinate/domain/StraightLineTest.java index 9cc7675b..72d7980a 100644 --- a/src/test/java/coordinate/domain/StraightLineTest.java +++ b/src/test/java/coordinate/domain/StraightLineTest.java @@ -51,18 +51,4 @@ void length() { assertThat(length).isEqualTo(1.414, offset(0.001)); } - - @Test - @DisplayName("선의 넓이를 반환한다") - void area() { - //given - List points = Arrays.asList(new Point(0, 0), new Point(1, 1)); - AbstractFigure figure = new StraightLine(points); - - //when - double area = figure.area(); - - //then - assertThat(area).isZero(); - } } From e2a375619ef09423871e32b32447e84dbda6a6fc Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Wed, 17 Nov 2021 23:01:34 +0900 Subject: [PATCH 23/37] =?UTF-8?q?refactor=20:=20=EC=A7=81=EC=84=A0=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EC=B2=B4=ED=81=AC=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/coordinate/domain/StraightLine.java | 12 ++++++++++++ .../coordinate/domain/StraightLineTest.java | 19 +++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/main/java/coordinate/domain/StraightLine.java b/src/main/java/coordinate/domain/StraightLine.java index af70e412..11cdd19f 100644 --- a/src/main/java/coordinate/domain/StraightLine.java +++ b/src/main/java/coordinate/domain/StraightLine.java @@ -2,19 +2,23 @@ import coordinate.domain.vo.Point; +import java.util.HashSet; import java.util.List; import java.util.Objects; +import java.util.Set; public class StraightLine implements Line { private static final int NUMBER_OF_LINE_POINTS = 2; private static final String INVALID_NUMBER_OF_STRAIGHT_LINE_POINTS_EXCEPTION_MESSAGE = "선의 점의 개수는 2개여야 합니다"; + private static final String DUPLICATE_LINE_POINTS_EXCEPTION_MESSAGE = "점 사이에 중복이 존재합니다"; private final List points; public StraightLine(List points) { validateNumberOf(points); + validateDuplicateOf(points); this.points = points; } @@ -24,6 +28,14 @@ private void validateNumberOf(final List points) { } } + private void validateDuplicateOf(final List points) { + Set distinctPoints = new HashSet<>(points); + + if (distinctPoints.size() < points.size()) { + throw new IllegalArgumentException(DUPLICATE_LINE_POINTS_EXCEPTION_MESSAGE); + } + } + private List points() { return points; } diff --git a/src/test/java/coordinate/domain/StraightLineTest.java b/src/test/java/coordinate/domain/StraightLineTest.java index 72d7980a..ec8852f3 100644 --- a/src/test/java/coordinate/domain/StraightLineTest.java +++ b/src/test/java/coordinate/domain/StraightLineTest.java @@ -4,10 +4,10 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.util.Arrays; import java.util.Collections; import java.util.List; +import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.offset; @@ -18,7 +18,7 @@ class StraightLineTest { @DisplayName("선을 생성한다") void create() { //given - List points = Arrays.asList(new Point(0, 0), new Point(1, 1)); + List points = asList(new Point(0, 0), new Point(1, 1)); //when Line line = new StraightLine(points); @@ -36,14 +36,25 @@ void create_throw_exception_with_invalid_number_of_points() { //then assertThatIllegalArgumentException().isThrownBy(() -> new StraightLine(points)) - .withMessageContaining("선의 점의 개수는 2개여야 합니다"); + .withMessage("선의 점의 개수는 2개여야 합니다"); + } + + @Test + @DisplayName("점 사이에 중복이 존재하면 예외를 발생시킨다") + void create_throw_exception_with_duplicate_points() { + //given + List points = asList(new Point(0, 0), new Point(0, 0)); + + //then + assertThatIllegalArgumentException().isThrownBy(() -> new StraightLine(points)) + .withMessage("점 사이에 중복이 존재합니다"); } @Test @DisplayName("선의 길이를 반환한다") void length() { //given - List points = Arrays.asList(new Point(0, 0), new Point(1, 1)); + List points = asList(new Point(0, 0), new Point(1, 1)); Line line = new StraightLine(points); //when From d36c077304e895e06917e1532da213adea503326 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Wed, 17 Nov 2021 23:01:56 +0900 Subject: [PATCH 24/37] =?UTF-8?q?refactor=20:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=83=81=EC=86=8D=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coordinate/domain/AbstractFigure.java | 43 ------------------- .../coordinate/domain/AbstractFigureTest.java | 38 ---------------- 2 files changed, 81 deletions(-) delete mode 100644 src/main/java/coordinate/domain/AbstractFigure.java delete mode 100644 src/test/java/coordinate/domain/AbstractFigureTest.java diff --git a/src/main/java/coordinate/domain/AbstractFigure.java b/src/main/java/coordinate/domain/AbstractFigure.java deleted file mode 100644 index dc579113..00000000 --- a/src/main/java/coordinate/domain/AbstractFigure.java +++ /dev/null @@ -1,43 +0,0 @@ -package coordinate.domain; - -import coordinate.domain.vo.Point; - -import java.util.HashSet; -import java.util.List; -import java.util.Objects; - -public abstract class AbstractFigure implements Figure { - - private static final String DUPLICATE_POINTS_MESSAGE = "점들 사이에 중복이 존재합니다"; - protected final List points; - - protected AbstractFigure(final List points) { - validateDuplicateOf(points); - this.points = points; - } - - private void validateDuplicateOf(final List points) { - HashSet set = new HashSet<>(points); - - if (set.size() != points.size()) { - throw new IllegalArgumentException(DUPLICATE_POINTS_MESSAGE); - } - } - - private List points() { - return points; - } - - @Override - public boolean equals(final Object other) { - if (this == other) return true; - if (!(other instanceof AbstractFigure)) return false; - final AbstractFigure figure = (AbstractFigure) other; - return points().equals(figure.points()); - } - - @Override - public int hashCode() { - return Objects.hash(points); - } -} diff --git a/src/test/java/coordinate/domain/AbstractFigureTest.java b/src/test/java/coordinate/domain/AbstractFigureTest.java deleted file mode 100644 index 19ecbebc..00000000 --- a/src/test/java/coordinate/domain/AbstractFigureTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package coordinate.domain; - -import coordinate.domain.vo.Point; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; - -class AbstractFigureTest { - - @Test - @DisplayName("점들을 인자로 받아 도형을 생성한다") - void create() { - //given - List points = Arrays.asList(new Point(0, 0), new Point(1, 1)); - - //when - AbstractFigure figure = new StraightLine(points); - - //then - assertThat(figure).isEqualTo(new StraightLine(points)); - } - - @Test - @DisplayName("점들 중 중복이 존재하면 예외를 발생시킨다") - void create_throw_exception_with_duplicate_points() { - //given - List points = Arrays.asList(new Point(0, 0), new Point(0, 0)); - - //then - assertThatIllegalArgumentException().isThrownBy(() -> new StraightLine(points)) - .withMessage("점들 사이에 중복이 존재합니다"); - } -} From a26dfbb63016c266ef2852fefc66bfbea4fda986 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Wed, 17 Nov 2021 23:10:47 +0900 Subject: [PATCH 25/37] =?UTF-8?q?refactor=20:=20=EC=A0=90=20=EC=82=AC?= =?UTF-8?q?=EC=9D=B4=EC=9D=98=20=EC=A4=91=EB=B3=B5=20=EA=B2=80=EC=82=AC=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=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 --- .../java/coordinate/domain/Rectangle.java | 46 ++++++++++++++++--- .../java/coordinate/domain/RectangleTest.java | 25 +++++++--- 2 files changed, 57 insertions(+), 14 deletions(-) diff --git a/src/main/java/coordinate/domain/Rectangle.java b/src/main/java/coordinate/domain/Rectangle.java index f77bef62..3a167712 100644 --- a/src/main/java/coordinate/domain/Rectangle.java +++ b/src/main/java/coordinate/domain/Rectangle.java @@ -3,31 +3,46 @@ import coordinate.domain.vo.Coordinate; import coordinate.domain.vo.Point; -import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.IntStream; -public class Rectangle extends AbstractFigure { +import static java.util.Arrays.asList; + +public class Rectangle implements Figure { private static final int NUMBER_OF_RECTANGLE_POINTS = 4; private static final int NUMBER_OF_DUPLICATED_COORDINATE = 2; - private static final String INVALID_NUMBER_OF_RECTANGLE_POINTS = "사각형의 점은 4개여야 합니다"; + private static final String INVALID_NUMBER_OF_RECTANGLE_POINTS_MESSAGE = "사각형의 점은 4개여야 합니다"; private static final String INVALID_RECTANGLE_MESSAGE = "직사각형이 아닙니다"; + private static final String DUPLICATE_POINTS_EXCEPTION_MESSAGE = "점 사이에 중복이 존재합니다"; + + private final List points; public Rectangle(final List points) { - super(points); validateNumberOf(points); + validateDuplicateOf(points); validateIsRectangle(points); + this.points = points; } private void validateNumberOf(final List points) { if (points.size() != NUMBER_OF_RECTANGLE_POINTS) { - throw new IllegalArgumentException(INVALID_NUMBER_OF_RECTANGLE_POINTS); + throw new IllegalArgumentException(INVALID_NUMBER_OF_RECTANGLE_POINTS_MESSAGE); + } + } + + private void validateDuplicateOf(final List points) { + Set distinctPoints = new HashSet<>(points); + + if (distinctPoints.size() < points.size()) { + throw new IllegalArgumentException(DUPLICATE_POINTS_EXCEPTION_MESSAGE); } } @@ -51,14 +66,18 @@ private boolean hasTwo(final Set duplicatedRemovedCoordinate) { return duplicatedRemovedCoordinate.size() != NUMBER_OF_DUPLICATED_COORDINATE; } + private List points() { + return points; + } + @Override public double area() { Point point = points.get(0); Point sameXCoordinatePoint = getSameCoordinatePoint(point::hasSameXCoordinate); Point sameYCoordinatePoint = getSameCoordinatePoint(point::hasSameYCoordinate); - Line width = new StraightLine(Arrays.asList(point, sameXCoordinatePoint)); - Line height = new StraightLine(Arrays.asList(point, sameYCoordinatePoint)); + Line width = new StraightLine(asList(point, sameXCoordinatePoint)); + Line height = new StraightLine(asList(point, sameYCoordinatePoint)); return width.length() * height.length(); } @@ -72,4 +91,17 @@ private Point getSameCoordinatePoint(final Predicate hasSameCoordinatePre .findAny() .orElseThrow(() -> new IllegalStateException(INVALID_RECTANGLE_MESSAGE)); } + + @Override + public boolean equals(final Object other) { + if (this == other) return true; + if (!(other instanceof Rectangle)) return false; + final Rectangle rectangle = (Rectangle) other; + return points().equals(rectangle.points()); + } + + @Override + public int hashCode() { + return Objects.hash(points); + } } diff --git a/src/test/java/coordinate/domain/RectangleTest.java b/src/test/java/coordinate/domain/RectangleTest.java index 507276df..612c4ffc 100644 --- a/src/test/java/coordinate/domain/RectangleTest.java +++ b/src/test/java/coordinate/domain/RectangleTest.java @@ -7,11 +7,11 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Stream; +import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.offset; @@ -24,7 +24,7 @@ class RectangleTest { void create() { //given List points = - Arrays.asList(new Point(0, 0), new Point(1, 1), new Point(0, 1), new Point(1, 0)); + asList(new Point(0, 0), new Point(1, 1), new Point(0, 1), new Point(1, 0)); //when Rectangle rectangle = new Rectangle(points); @@ -53,19 +53,30 @@ void create_throw_exception_with_is_not_rectangle_points(final List point .withMessage("직사각형이 아닙니다"); } + @Test + @DisplayName("") + void create_throw_exception_with_duplicate_points() { + //given + List points = + asList(new Point(0, 0), new Point(0, 0), new Point(1, 1), new Point(1, 1)); + //then + assertThatIllegalArgumentException().isThrownBy(() -> new Rectangle(points)) + .withMessage("점 사이에 중복이 존재합니다"); + } + static Stream isNotRectanglePoints() { return Stream.of( arguments( - Arrays.asList( + asList( new Point(0, 0), new Point(1, 0), new Point(2, 0), new Point(3, 0)), - Arrays.asList( + asList( new Point(0, 0), new Point(0, 1), new Point(0, 2), new Point(0, 3)), - Arrays.asList( + asList( new Point(0, 0), new Point(1, 0), new Point(0, 1), new Point(1, 2)), - Arrays.asList( + asList( new Point(0, 0), new Point(1, 1), new Point(2, 2), new Point(3, 3)))); } @@ -75,7 +86,7 @@ static Stream isNotRectanglePoints() { void area() { //given List points = - Arrays.asList(new Point(0, 0), new Point(1, 1), new Point(0, 1), new Point(1, 0)); + asList(new Point(0, 0), new Point(1, 1), new Point(0, 1), new Point(1, 0)); Rectangle rectangle = new Rectangle(points); //when From ec8d40c7fa4d11c202b010b98c50a4de05c3455c Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 18 Nov 2021 14:23:00 +0900 Subject: [PATCH 26/37] =?UTF-8?q?chore=20:=20=EC=9E=90=EB=B0=94=20?= =?UTF-8?q?=EB=B2=84=EC=A0=84=2011=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8172fb73..fd548118 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'eclipse' group = 'camp.nextstep' version = '1.0.0' -sourceCompatibility = '1.8' +sourceCompatibility = '11' repositories { mavenCentral() From eda750a4498ea23f3bfc2e33640c1c661a3b0bad Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 18 Nov 2021 14:30:18 +0900 Subject: [PATCH 27/37] =?UTF-8?q?feat=20:=20=EC=82=BC=EA=B0=81=ED=98=95=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=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/domain/Triangle.java | 106 ++++++++++++++++++ .../java/coordinate/domain/TriangleTest.java | 61 ++++++++++ 2 files changed, 167 insertions(+) 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/Triangle.java b/src/main/java/coordinate/domain/Triangle.java new file mode 100644 index 00000000..1b2c7bb9 --- /dev/null +++ b/src/main/java/coordinate/domain/Triangle.java @@ -0,0 +1,106 @@ +package coordinate.domain; + +import coordinate.domain.vo.Point; + +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static java.util.Arrays.asList; + +public class Triangle implements Figure { + + private static final String INVALID_NUMBER_OF_TRIANGLE_POINTS_MESSAGE = "삼각형의 점은 3개 여야 합니다"; + private static final int NUMBER_OF_TRIANGLE_POINTS = 3; + private static final String INVALID_TRIANGLE_POINTS_EXCEPTION_MESSAGE = "삼각형이 아닙니다"; + private static final String DUPLICATED_POINTS_EXCEPTION_MESSAGE = "점 사이에 중복이 존재합니다"; + + private final List points; + + public Triangle(final List points) { + validateNumberOf(points); + validateDuplicateOf(points); + validateIsTriangle(points); + this.points = points; + } + + private void validateNumberOf(final List points) { + if (points.size() != NUMBER_OF_TRIANGLE_POINTS) { + throw new IllegalArgumentException(INVALID_NUMBER_OF_TRIANGLE_POINTS_MESSAGE); + } + } + + private void validateDuplicateOf(final List points) { + HashSet distinctPoints = new HashSet<>(points); + + if (distinctPoints.size() < points.size()) { + throw new IllegalArgumentException(DUPLICATED_POINTS_EXCEPTION_MESSAGE); + } + } + + private void validateIsTriangle(final List points) { + List sidesSortedByDesc = getSidesOrderByDescFrom(points); + + if (isTriangle(sidesSortedByDesc)) { + throw new IllegalArgumentException(INVALID_TRIANGLE_POINTS_EXCEPTION_MESSAGE); + } + } + + private List getSidesOrderByDescFrom(final List points) { + return IntStream.range(0, points.size()) + .mapToObj(index -> asList(points.get(index), points.get((index + 1) % NUMBER_OF_TRIANGLE_POINTS))) + .map(StraightLine::new) + .sorted((line, other) -> (int) (other.length() - line.length())) + .collect(Collectors.toUnmodifiableList()); + } + + private boolean isTriangle(final List sidesSortedByDesc) { + return sidesSortedByDesc.get(0).length() >= + sidesSortedByDesc.get(1).length() + sidesSortedByDesc.get(2).length(); + } + + private List points() { + return points; + } + + @Override + public double area() { + List sidesOrderByDesc = getSidesOrderByDescFrom(points); + return heronsFormula(sidesOrderByDesc); + } + + private double heronsFormula(final List sidesOrderByDesc) { + double halfPerimeter = calculateHalfPerimeter(sidesOrderByDesc); + double areaSquared = calculateSquareOfArea(sidesOrderByDesc, halfPerimeter); + return Math.sqrt(areaSquared); + } + + private double calculateHalfPerimeter(final List sidesOrderByDesc) { + double sumOfSides = sidesOrderByDesc.stream() + .mapToDouble(Line::length) + .sum(); + + return sumOfSides / 2; + } + + private double calculateSquareOfArea(final List sidesOrderByDesc, final double halfPerimeter) { + return sidesOrderByDesc.stream() + .mapToDouble(Line::length) + .reduce(halfPerimeter, (total, side) -> total * (halfPerimeter - side)); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (!(o instanceof Triangle)) return false; + final Triangle triangle = (Triangle) o; + return points().equals(triangle.points()); + } + + @Override + public int hashCode() { + return Objects.hash(points); + } +} diff --git a/src/test/java/coordinate/domain/TriangleTest.java b/src/test/java/coordinate/domain/TriangleTest.java new file mode 100644 index 00000000..93a915f9 --- /dev/null +++ b/src/test/java/coordinate/domain/TriangleTest.java @@ -0,0 +1,61 @@ +package coordinate.domain; + +import coordinate.domain.vo.Point; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.junit.jupiter.params.provider.Arguments.arguments; + +class TriangleTest { + + @Test + @DisplayName("삼각형을 생성한다") + void create() { + //given + List points = Arrays.asList(new Point(0, 0), new Point(1, 0), new Point(0, 3)); + + //when + Triangle triangle = new Triangle(points); + + //then + assertThat(triangle).isEqualTo(new Triangle(points)); + } + + @Test + @DisplayName("점이 3개가 아니라면 예외를 발생시킨다") + void create_throw_exception_with_invalid_number_of_points() { + //given + List points = Collections.singletonList(new Point(0, 0)); + + //then + assertThatIllegalArgumentException().isThrownBy(() -> new Triangle(points)) + .withMessage("삼각형의 점은 3개 여야 합니다"); + } + + @ParameterizedTest + @MethodSource("isNotTrianglePoints") + @DisplayName("점 3개가 삼각형이 아닐 경우 예외를 발생시킨다") + void create_throw_exception_with_is_not_triangle(final List points) { + //then + assertThatIllegalArgumentException().isThrownBy(() -> new Triangle(points)) + .withMessage("삼각형이 아닙니다"); + } + + static Stream isNotTrianglePoints() { + return Stream.of( + arguments( + Arrays.asList(new Point(0, 0), new Point(0, 1), new Point(0, 2)), + Arrays.asList(new Point(0, 0), new Point(1, 0), new Point(2, 0)), + Arrays.asList(new Point(0, 0), new Point(1, 1), new Point(2, 2)))); + } +} From 479fec91b2d981d8091c6eb37ebde92bba3e9c5f Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 18 Nov 2021 14:34:28 +0900 Subject: [PATCH 28/37] =?UTF-8?q?refactor=20:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EA=B8=B0=EC=9A=B8=EA=B8=B0=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EB=A9=94=EC=84=9C=EB=93=9C=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/domain/vo/Point.java | 14 ------- .../java/coordinate/domain/vo/PointTest.java | 37 ------------------- 2 files changed, 51 deletions(-) diff --git a/src/main/java/coordinate/domain/vo/Point.java b/src/main/java/coordinate/domain/vo/Point.java index cbb31572..dffd098d 100644 --- a/src/main/java/coordinate/domain/vo/Point.java +++ b/src/main/java/coordinate/domain/vo/Point.java @@ -5,9 +5,6 @@ public class Point { private static final int EXPONENT = 2; - private static final int INVALID_X_INCREMENT = 0; - - private static final String INVALID_X_INCREMENT_EXCEPTION_MESSAGE = "x 변화량이 0일 경우 기울기가 무한대가 됩니다"; private final Coordinate x; private final Coordinate y; @@ -44,17 +41,6 @@ public boolean hasSameYCoordinate(final Point otherPoint) { return y().equals(otherPoint.y()); } - public double absoluteSlopeValue(final Point otherPoint) { - double xIncrement = x().absoluteIncrementValue(otherPoint.x()); - double yIncrement = y().absoluteIncrementValue(otherPoint.y()); - - if (xIncrement == INVALID_X_INCREMENT) { - throw new IllegalArgumentException(INVALID_X_INCREMENT_EXCEPTION_MESSAGE); - } - - return yIncrement / xIncrement; - } - @Override public boolean equals(final Object o) { if (this == o) return true; diff --git a/src/test/java/coordinate/domain/vo/PointTest.java b/src/test/java/coordinate/domain/vo/PointTest.java index dd724352..4979253d 100644 --- a/src/test/java/coordinate/domain/vo/PointTest.java +++ b/src/test/java/coordinate/domain/vo/PointTest.java @@ -6,7 +6,6 @@ import org.junit.jupiter.params.provider.CsvSource; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.offset; class PointTest { @@ -117,40 +116,4 @@ void hasSameYCoordinate(final int yValue, final int otherYValue, final boolean e //then assertThat(actual).isEqualTo(expected); } - - @Test - @DisplayName("다른 점과의 기울기의 절대값을 반환한다") - void absoluteSlopeValue() { - //given - int xValue = 1; - int yValue = 1; - Point point = new Point(xValue, yValue); - - int otherXValue = 4; - int otherYValue = 2; - Point otherPoint = new Point(otherXValue, otherYValue); - - //when - double actual = point.absoluteSlopeValue(otherPoint); - - //then - assertThat(actual).isEqualTo(0.333, offset(0.001)); - } - - @Test - @DisplayName("다른 점과의 기울기의 절대값을 반환한다") - void absoluteSlopeValue_throw_exception_with_not_increase_x_value() { - //given - int xValue = 1; - int yValue = 1; - Point point = new Point(xValue, yValue); - - int otherXValue = 1; - int otherYValue = 2; - Point otherPoint = new Point(otherXValue, otherYValue); - - //then - assertThatIllegalArgumentException().isThrownBy(() -> point.absoluteSlopeValue(otherPoint)) - .withMessage("x 변화량이 0일 경우 기울기가 무한대가 됩니다"); - } } From 7c7045b6e92cc30f2f6e71294c91859d7fd172b2 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 18 Nov 2021 14:35:40 +0900 Subject: [PATCH 29/37] =?UTF-8?q?feat=20:=20=EB=8F=84=ED=98=95=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=ED=8C=A9=ED=86=A0=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=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 --- .../java/coordinate/domain/FigureFactory.java | 38 ++++++++++++++++++ .../coordinate/domain/FigureFactoryTest.java | 40 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 src/main/java/coordinate/domain/FigureFactory.java create mode 100644 src/test/java/coordinate/domain/FigureFactoryTest.java diff --git a/src/main/java/coordinate/domain/FigureFactory.java b/src/main/java/coordinate/domain/FigureFactory.java new file mode 100644 index 00000000..257f2f9f --- /dev/null +++ b/src/main/java/coordinate/domain/FigureFactory.java @@ -0,0 +1,38 @@ +package coordinate.domain; + +import coordinate.domain.vo.Point; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +public class FigureFactory { + + private static final String INVALID_NUMBER_OF_POINTS_MESSAGE = "유효하지 않은 점의 개수입니다"; + private static final int NUMBER_OF_TRIANGLE_POINTS = 3; + private static final int NUMBER_OF_RECTANGLE_POINTS = 4; + + private static final Map, Figure>> factory = new HashMap<>(); + + static { + factory.put(NUMBER_OF_TRIANGLE_POINTS, Triangle::new); + factory.put(NUMBER_OF_RECTANGLE_POINTS, Rectangle::new); + } + + private FigureFactory() { + + } + + public static Figure create(final List points) { + int numberOfPoints = points.size(); + validateNumberOfPoints(numberOfPoints); + return factory.get(numberOfPoints).apply(points); + } + + private static void validateNumberOfPoints(final int numberOfPoints) { + if (numberOfPoints < NUMBER_OF_TRIANGLE_POINTS || numberOfPoints > NUMBER_OF_RECTANGLE_POINTS) { + throw new IllegalArgumentException(INVALID_NUMBER_OF_POINTS_MESSAGE); + } + } +} diff --git a/src/test/java/coordinate/domain/FigureFactoryTest.java b/src/test/java/coordinate/domain/FigureFactoryTest.java new file mode 100644 index 00000000..f3eb9be6 --- /dev/null +++ b/src/test/java/coordinate/domain/FigureFactoryTest.java @@ -0,0 +1,40 @@ +package coordinate.domain; + +import coordinate.domain.vo.Point; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static java.util.Arrays.asList; +import static org.assertj.core.api.Assertions.assertThat; + +class FigureFactoryTest { + + @Test + @DisplayName("점 3개를 입력받아 삼각형을 생성한다") + void create_rectangle() { + //given + List points = asList(new Point(1, 1), new Point(2, 2), new Point(3, 1)); + + //when + Figure actual = FigureFactory.create(points); + + //then + assertThat(actual).isEqualTo(new Triangle(points)); + } + + @Test + @DisplayName("점 4개를 입력받아 사각형을 생성한다") + void create_triangle() { + //given + List points = + asList(new Point(1, 1), new Point(2, 1), new Point(1, 2), new Point(2, 2)); + + //when + Figure actual = FigureFactory.create(points); + + //then + assertThat(actual).isEqualTo(new Rectangle(points)); + } +} From 19d99f5f55bec8e2403101ff641293dd8a65f799 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 18 Nov 2021 16:56:53 +0900 Subject: [PATCH 30/37] =?UTF-8?q?style=20:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EC=9C=84=EC=B9=98=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/domain/vo/Coordinate.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/coordinate/domain/vo/Coordinate.java b/src/main/java/coordinate/domain/vo/Coordinate.java index e3aad455..d102f3dd 100644 --- a/src/main/java/coordinate/domain/vo/Coordinate.java +++ b/src/main/java/coordinate/domain/vo/Coordinate.java @@ -4,7 +4,6 @@ public class Coordinate { - private static final int MIN_COORDINATE_VALUE = 0; private static final int MAX_COORDINATE_VALUE = 24; private static final String INVALID_COORDINATE_VALUE_MESSAGE = "좌표 값은 0이상 24이하여야 합니다"; @@ -30,6 +29,11 @@ private int value() { return value; } + public int absoluteIncrementValue(final Coordinate otherCoordinate) { + int increment = value() - otherCoordinate.value(); + return Math.abs(increment); + } + @Override public boolean equals(final Object o) { if (this == o) return true; @@ -42,9 +46,4 @@ public boolean equals(final Object o) { public int hashCode() { return Objects.hash(value); } - - public int absoluteIncrementValue(final Coordinate otherCoordinate) { - int increment = value() - otherCoordinate.value(); - return Math.abs(increment); - } } From ba33221561737d5e31145d3b70ba2e82763c7c89 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 18 Nov 2021 16:57:43 +0900 Subject: [PATCH 31/37] =?UTF-8?q?feat=20:=20InputView=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coordinate/view/InputConsoleView.java | 61 +++++++++++++++++++ src/main/java/coordinate/view/InputView.java | 9 +++ 2 files changed, 70 insertions(+) create mode 100644 src/main/java/coordinate/view/InputConsoleView.java create mode 100644 src/main/java/coordinate/view/InputView.java diff --git a/src/main/java/coordinate/view/InputConsoleView.java b/src/main/java/coordinate/view/InputConsoleView.java new file mode 100644 index 00000000..8d3de07f --- /dev/null +++ b/src/main/java/coordinate/view/InputConsoleView.java @@ -0,0 +1,61 @@ +package coordinate.view; + +import coordinate.domain.vo.Point; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.regex.Pattern; + +import static java.lang.System.out; +import static java.util.stream.Collectors.toUnmodifiableList; + +public class InputConsoleView implements InputView { + + private static final int X_COORDINATE_INDEX = 0; + private static final int Y_COORDINATE_INDEX = 1; + + private static final String INPUT_MESSAGE = "좌표를 입력하세요."; + private static final String INVALID_INPUT_EXCEPTION_MESSAGE = "입력 값이 유효하지 않습니다"; + + private static final String POINTS_INPUT_DELIMITER = "-"; + private static final String COORDINATE_DELIMITER = ",[\\s]?"; + + private static final String INPUT_REGEX = "^(\\([0-9]{1,2},[\\s]?[0-9]{1,2}\\))(-\\([0-9]{1,2},[\\s]?[0-9]{1,2}\\))+$"; + private static final Pattern INPUT_PATTERN = Pattern.compile(INPUT_REGEX); + + private final Scanner scanner; + + public InputConsoleView(final Scanner scanner) { + this.scanner = scanner; + } + + @Override + public List input() { + out.println(INPUT_MESSAGE); + String input = scanner.nextLine(); + return parsePointsFrom(input); + } + + private List parsePointsFrom(final String input) { + validateOf(input); + String[] splattedPoints = input.split(POINTS_INPUT_DELIMITER); + return Arrays.stream(splattedPoints) + .map(this::parsePointFrom) + .collect(toUnmodifiableList()); + } + + private void validateOf(final String input) { + if (!INPUT_PATTERN.matcher(input).matches()) { + throw new IllegalArgumentException(INVALID_INPUT_EXCEPTION_MESSAGE); + } + } + + private Point parsePointFrom(final String token) { + String parenthesesRemovedToken = token.substring(1, token.length() - 1); + String[] splattedCoordinate = parenthesesRemovedToken.split(COORDINATE_DELIMITER); + int x = Integer.parseInt(splattedCoordinate[X_COORDINATE_INDEX]); + int y = Integer.parseInt(splattedCoordinate[Y_COORDINATE_INDEX]); + return new Point(x, y); + } +} diff --git a/src/main/java/coordinate/view/InputView.java b/src/main/java/coordinate/view/InputView.java new file mode 100644 index 00000000..230aadee --- /dev/null +++ b/src/main/java/coordinate/view/InputView.java @@ -0,0 +1,9 @@ +package coordinate.view; + +import coordinate.domain.vo.Point; + +import java.util.List; + +public interface InputView { + List input(); +} From 8209dca3eecbb8d2b5deaf7ccde9c12156a16057 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 18 Nov 2021 16:58:04 +0900 Subject: [PATCH 32/37] =?UTF-8?q?feat=20:=20OutputView=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coordinate/view/OutputConsoleView.java | 29 +++++++++++++++++++ src/main/java/coordinate/view/OutputView.java | 11 +++++++ 2 files changed, 40 insertions(+) create mode 100644 src/main/java/coordinate/view/OutputConsoleView.java create mode 100644 src/main/java/coordinate/view/OutputView.java diff --git a/src/main/java/coordinate/view/OutputConsoleView.java b/src/main/java/coordinate/view/OutputConsoleView.java new file mode 100644 index 00000000..a3883888 --- /dev/null +++ b/src/main/java/coordinate/view/OutputConsoleView.java @@ -0,0 +1,29 @@ +package coordinate.view; + +import coordinate.domain.Figure; +import coordinate.domain.Line; +import coordinate.domain.Rectangle; +import coordinate.domain.Triangle; + +import static java.lang.System.out; + +public class OutputConsoleView implements OutputView { + + private static final String LINE_PRINT_FORMAT = "두 점 사이 거리는 %f%n"; + private static final String TRIANGLE_PRINT_FORMAT = "삼각형의 넓이는 %f%n"; + private static final String RECTANGLE_PRINT_FORMAT = "사각형의 넓이는 %f%n"; + + @Override + public void printLine(final Line line) { + out.printf(LINE_PRINT_FORMAT, line.length()); + } + + @Override + public void printFigure(final Figure figure) { + if (figure instanceof Triangle) { + out.printf(TRIANGLE_PRINT_FORMAT, figure.area()); + } else if (figure instanceof Rectangle) { + out.printf(RECTANGLE_PRINT_FORMAT, figure.area()); + } + } +} diff --git a/src/main/java/coordinate/view/OutputView.java b/src/main/java/coordinate/view/OutputView.java new file mode 100644 index 00000000..4e2ce56f --- /dev/null +++ b/src/main/java/coordinate/view/OutputView.java @@ -0,0 +1,11 @@ +package coordinate.view; + +import coordinate.domain.Figure; +import coordinate.domain.Line; + +public interface OutputView { + + void printLine(final Line line); + + void printFigure(final Figure figure); +} From db8671abc8acb7df96f3f83d0982e8fd033d990c Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 18 Nov 2021 16:59:00 +0900 Subject: [PATCH 33/37] =?UTF-8?q?feat=20:=20CoordinateController=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CoordinateController.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/main/java/coordinate/controller/CoordinateController.java diff --git a/src/main/java/coordinate/controller/CoordinateController.java b/src/main/java/coordinate/controller/CoordinateController.java new file mode 100644 index 00000000..42ddaaa9 --- /dev/null +++ b/src/main/java/coordinate/controller/CoordinateController.java @@ -0,0 +1,49 @@ +package coordinate.controller; + +import coordinate.domain.Figure; +import coordinate.domain.FigureFactory; +import coordinate.domain.Line; +import coordinate.domain.StraightLine; +import coordinate.domain.vo.Point; +import coordinate.view.InputView; +import coordinate.view.OutputView; + +import java.util.List; + +public class CoordinateController { + + private static final int NUMBER_OF_LINE = 2; + + private final InputView inputView; + private final OutputView outputView; + + public CoordinateController(final InputView inputView, final OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + public void run() { + List points = inputView.input(); + + if (isLineNumberOf(points)) { + printLine(points); + return; + } + + printFigure(points); + } + + private boolean isLineNumberOf(final List points) { + return points.size() == NUMBER_OF_LINE; + } + + private void printLine(final List points) { + Line line = new StraightLine(points); + outputView.printLine(line); + } + + private void printFigure(final List points) { + Figure figure = FigureFactory.create(points); + outputView.printFigure(figure); + } +} From 4dac679b66a7ce670e4fe1d5282aec000cb4cf3e Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 18 Nov 2021 16:59:37 +0900 Subject: [PATCH 34/37] =?UTF-8?q?feat=20:=20Main=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EA=B8=B0=EB=8A=A5=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 | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/coordinate/CoordinateMain.java diff --git a/src/main/java/coordinate/CoordinateMain.java b/src/main/java/coordinate/CoordinateMain.java new file mode 100644 index 00000000..fc909d1c --- /dev/null +++ b/src/main/java/coordinate/CoordinateMain.java @@ -0,0 +1,20 @@ +package coordinate; + +import coordinate.controller.CoordinateController; +import coordinate.view.InputConsoleView; +import coordinate.view.InputView; +import coordinate.view.OutputConsoleView; +import coordinate.view.OutputView; + +import java.util.Scanner; + +public class CoordinateMain { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + InputView inputView = new InputConsoleView(scanner); + OutputView outputView = new OutputConsoleView(); + CoordinateController coordinateController = new CoordinateController(inputView, outputView); + coordinateController.run(); + scanner.close(); + } +} From bcddcf2be75ef51b3953ee3069a352e1e9c8ee6d Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Sat, 20 Nov 2021 16:34:05 +0900 Subject: [PATCH 35/37] =?UTF-8?q?refactor=20:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/coordinate/domain/vo/Coordinate.java | 5 ----- .../coordinate/domain/vo/CoordinateTest.java | 17 ----------------- 2 files changed, 22 deletions(-) diff --git a/src/main/java/coordinate/domain/vo/Coordinate.java b/src/main/java/coordinate/domain/vo/Coordinate.java index d102f3dd..20e0625b 100644 --- a/src/main/java/coordinate/domain/vo/Coordinate.java +++ b/src/main/java/coordinate/domain/vo/Coordinate.java @@ -29,11 +29,6 @@ private int value() { return value; } - public int absoluteIncrementValue(final Coordinate otherCoordinate) { - int increment = value() - otherCoordinate.value(); - return Math.abs(increment); - } - @Override public boolean equals(final Object o) { if (this == o) return true; diff --git a/src/test/java/coordinate/domain/vo/CoordinateTest.java b/src/test/java/coordinate/domain/vo/CoordinateTest.java index 72c7daa6..e08057a1 100644 --- a/src/test/java/coordinate/domain/vo/CoordinateTest.java +++ b/src/test/java/coordinate/domain/vo/CoordinateTest.java @@ -48,21 +48,4 @@ void distance() { //then assertThat(distance).isEqualTo(1); } - - @Test - @DisplayName("다른 좌표 값과 절대 증가값을 반환한다") - void absoluteIncrementValue() { - //given - int value = 1; - Coordinate coordinate = new Coordinate(value); - - int otherValue = 3; - Coordinate otherCoordinate = new Coordinate(otherValue); - - //when - int absoluteIncrementValue = coordinate.absoluteIncrementValue(otherCoordinate); - - //then - assertThat(absoluteIncrementValue).isEqualTo(2); - } } From ad3203d3258de26c34f5206f1b319919fea0f660 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Sat, 20 Nov 2021 16:35:15 +0900 Subject: [PATCH 36/37] =?UTF-8?q?refactor=20:=20equals=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=EC=97=90=EC=84=9C=20=ED=95=84=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=A1=9C=20=EC=A0=91?= =?UTF-8?q?=EA=B7=BC=ED=95=98=EB=8F=84=EB=A1=9D=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/domain/vo/Point.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/coordinate/domain/vo/Point.java b/src/main/java/coordinate/domain/vo/Point.java index dffd098d..393faa58 100644 --- a/src/main/java/coordinate/domain/vo/Point.java +++ b/src/main/java/coordinate/domain/vo/Point.java @@ -34,7 +34,7 @@ public Coordinate y() { } public boolean hasSameXCoordinate(final Point otherPoint) { - return x().equals(otherPoint.x); + return x().equals(otherPoint.x()); } public boolean hasSameYCoordinate(final Point otherPoint) { @@ -42,11 +42,11 @@ public boolean hasSameYCoordinate(final Point otherPoint) { } @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (!(o instanceof Point)) return false; - final Point point = (Point) o; - return x.equals(point.x) && y.equals(point.y); + public boolean equals(final Object other) { + if (this == other) return true; + if (!(other instanceof Point)) return false; + final Point point = (Point) other; + return x().equals(point.x()) && y().equals(point.y()); } @Override From 37b5553225daf3854e87d73813207b2023b88d7f Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Sat, 20 Nov 2021 16:37:04 +0900 Subject: [PATCH 37/37] =?UTF-8?q?refactor=20:=20View=20=EC=97=90=EC=84=9C?= =?UTF-8?q?=20Figure=20=EA=B5=AC=ED=98=84=EC=B2=B4=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/coordinate/domain/Figure.java | 3 ++- src/main/java/coordinate/domain/Rectangle.java | 5 +++++ src/main/java/coordinate/domain/Triangle.java | 15 ++++++++++----- .../java/coordinate/view/OutputConsoleView.java | 11 ++--------- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/main/java/coordinate/domain/Figure.java b/src/main/java/coordinate/domain/Figure.java index 2bb8313f..2ba5c5de 100644 --- a/src/main/java/coordinate/domain/Figure.java +++ b/src/main/java/coordinate/domain/Figure.java @@ -1,6 +1,7 @@ package coordinate.domain; -@FunctionalInterface public interface Figure { double area(); + + String figureType(); } diff --git a/src/main/java/coordinate/domain/Rectangle.java b/src/main/java/coordinate/domain/Rectangle.java index 3a167712..5c61dd85 100644 --- a/src/main/java/coordinate/domain/Rectangle.java +++ b/src/main/java/coordinate/domain/Rectangle.java @@ -70,6 +70,11 @@ private List points() { return points; } + @Override + public String figureType() { + return "사각형"; + } + @Override public double area() { Point point = points.get(0); diff --git a/src/main/java/coordinate/domain/Triangle.java b/src/main/java/coordinate/domain/Triangle.java index 1b2c7bb9..7c921802 100644 --- a/src/main/java/coordinate/domain/Triangle.java +++ b/src/main/java/coordinate/domain/Triangle.java @@ -41,14 +41,14 @@ private void validateDuplicateOf(final List points) { } private void validateIsTriangle(final List points) { - List sidesSortedByDesc = getSidesOrderByDescFrom(points); + List sidesSortedByLengthDesc = getSidesOrderByLengthDescFrom(points); - if (isTriangle(sidesSortedByDesc)) { + if (isLongestSideLongerThanSumOfOtherSides(sidesSortedByLengthDesc)) { throw new IllegalArgumentException(INVALID_TRIANGLE_POINTS_EXCEPTION_MESSAGE); } } - private List getSidesOrderByDescFrom(final List points) { + private List getSidesOrderByLengthDescFrom(final List points) { return IntStream.range(0, points.size()) .mapToObj(index -> asList(points.get(index), points.get((index + 1) % NUMBER_OF_TRIANGLE_POINTS))) .map(StraightLine::new) @@ -56,7 +56,7 @@ private List getSidesOrderByDescFrom(final List points) { .collect(Collectors.toUnmodifiableList()); } - private boolean isTriangle(final List sidesSortedByDesc) { + private boolean isLongestSideLongerThanSumOfOtherSides(final List sidesSortedByDesc) { return sidesSortedByDesc.get(0).length() >= sidesSortedByDesc.get(1).length() + sidesSortedByDesc.get(2).length(); } @@ -65,9 +65,14 @@ private List points() { return points; } + @Override + public String figureType() { + return "삼각형"; + } + @Override public double area() { - List sidesOrderByDesc = getSidesOrderByDescFrom(points); + List sidesOrderByDesc = getSidesOrderByLengthDescFrom(points); return heronsFormula(sidesOrderByDesc); } diff --git a/src/main/java/coordinate/view/OutputConsoleView.java b/src/main/java/coordinate/view/OutputConsoleView.java index a3883888..5091b59a 100644 --- a/src/main/java/coordinate/view/OutputConsoleView.java +++ b/src/main/java/coordinate/view/OutputConsoleView.java @@ -2,16 +2,13 @@ import coordinate.domain.Figure; import coordinate.domain.Line; -import coordinate.domain.Rectangle; -import coordinate.domain.Triangle; import static java.lang.System.out; public class OutputConsoleView implements OutputView { private static final String LINE_PRINT_FORMAT = "두 점 사이 거리는 %f%n"; - private static final String TRIANGLE_PRINT_FORMAT = "삼각형의 넓이는 %f%n"; - private static final String RECTANGLE_PRINT_FORMAT = "사각형의 넓이는 %f%n"; + private static final String FIGURE_PRINT_FORMAT = "%s의 넓이는 %f%n"; @Override public void printLine(final Line line) { @@ -20,10 +17,6 @@ public void printLine(final Line line) { @Override public void printFigure(final Figure figure) { - if (figure instanceof Triangle) { - out.printf(TRIANGLE_PRINT_FORMAT, figure.area()); - } else if (figure instanceof Rectangle) { - out.printf(RECTANGLE_PRINT_FORMAT, figure.area()); - } + out.printf(FIGURE_PRINT_FORMAT, figure.figureType(), figure.area()); } }