diff --git a/src/main/java/io/github/js0ny/ilp_coursework/service/GpsCalculationService.java b/src/main/java/io/github/js0ny/ilp_coursework/service/GpsCalculationService.java index 0cf07f8..a27243a 100644 --- a/src/main/java/io/github/js0ny/ilp_coursework/service/GpsCalculationService.java +++ b/src/main/java/io/github/js0ny/ilp_coursework/service/GpsCalculationService.java @@ -40,6 +40,7 @@ public class GpsCalculationService { public double calculateDistance(LngLatDto position1, LngLatDto position2) { double lngDistance = position2.lng() - position1.lng(); double latDistance = position2.lat() - position1.lat(); + // Euclidean: \sqrt{a^2 + b^2} return Math.sqrt(lngDistance * lngDistance + latDistance * latDistance); } @@ -70,7 +71,7 @@ public class GpsCalculationService { * @see io.github.js0ny.ilp_coursework.controller.ApiController#getNextPosition(MovementRequestDto) */ public LngLatDto nextPosition(LngLatDto start, double angle) { - double rad = Math.toRadians(angle); + double rad = Math.toRadians(angle); // Convert to radian for Java triangle function calculation double newLng = Math.cos(rad) * STEP + start.lng(); double newLat = Math.sin(rad) * STEP + start.lat(); return new LngLatDto(newLng, newLat); diff --git a/src/test/java/io/github/js0ny/ilp_coursework/service/GpsCalculationServiceTest.java b/src/test/java/io/github/js0ny/ilp_coursework/service/GpsCalculationServiceTest.java index 0e46370..4f8a52d 100644 --- a/src/test/java/io/github/js0ny/ilp_coursework/service/GpsCalculationServiceTest.java +++ b/src/test/java/io/github/js0ny/ilp_coursework/service/GpsCalculationServiceTest.java @@ -10,6 +10,7 @@ import org.junit.jupiter.api.Test; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.AssertionsForClassTypes.within; @@ -350,5 +351,25 @@ public class GpsCalculationServiceTest { boolean actual = service.checkIsInRegion(position, RECTANGLE_REGION); assertThat(actual).isEqualTo(expected); } + + @Test + @DisplayName("Edge Case: Region not forming polygon") + void isInRegion_shouldThrowExceptions_whenRegionNotFormingPolygon() { + var position = new LngLatDto(2.0, 2.0); + var region = new RegionDto("line", List.of(new LngLatDto(0.0, 0.0), new LngLatDto(0.0001, 0.0), new LngLatDto(0.0, 0.0))); + assertThatThrownBy(() -> { + service.checkIsInRegion(position, region); + }).isInstanceOf(IllegalArgumentException.class).hasMessage("Region is not closed."); + } + + @Test + @DisplayName("Edge Case: Region is not closed") + void isInRegion_shouldThrowExceptions_whenRegionNotClose() { + var position = new LngLatDto(2.0, 2.0); + var region = new RegionDto("rectangle", List.of(new LngLatDto(0.0, 0.0), new LngLatDto(2.0, 0.0), new LngLatDto(2.0, 2.0), new LngLatDto(0.0, 2.0), new LngLatDto(0.0, -1.0))); + assertThatThrownBy(() -> { + service.checkIsInRegion(position, region); + }).isInstanceOf(IllegalArgumentException.class).hasMessage("Region is not closed."); + } } } \ No newline at end of file