// Copyright © 2015 HSL <https://www.hsl.fi>
// This program is dual-licensed under the EUPL v1.2 and AGPLv3 licenses.
package fi.hsl.parkandride.core.domain;
import static fi.hsl.parkandride.core.domain.Spatial.fromWktPolygon;
import static fi.hsl.parkandride.core.domain.Spatial.parseWKT;
import static org.assertj.core.api.Assertions.assertThat;
import org.geolatte.geom.*;
import org.junit.Test;
public class SpatialTest {
@Test(expected = IllegalArgumentException.class)
public void missing_inner_parenthesis() {
fromWktPolygon("POLYGON( 30 10, 40 40, 20 40, 10 20, 30 10 )");
}
@Test(expected = IllegalArgumentException.class)
public void missing_ending_parenthesis() {
parseWKT("POINT(1 1");
}
@Test(expected = IllegalArgumentException.class)
public void extra_input_after_valid_geometry() {
parseWKT("POINT(1 1) x");
}
@Test(expected = IllegalArgumentException.class)
public void valid_tokens_but_invalid_parser_syntax() {
parseWKT("POINT POLYGON");
}
@Test(expected = IllegalArgumentException.class)
public void invalid_type() {
parseWKT("PINT(1 1)");
}
@Test(expected = IllegalArgumentException.class)
public void unclosed_polygon() {
parseWKT("POLYGON ((30 10, 40 40, 20 40, 10 20, 30 11))");
}
@Test(expected = IllegalArgumentException.class)
public void too_short_polygon() {
parseWKT("POLYGON((1 1, 2 2, 1 1))");
}
@Test
public void ignore_whitespace() {
assertPoint((Point) parseWKT("\nPOINT\t ( 1\r2)\t\r \n"), 1, 2);
}
@Test(expected = IllegalArgumentException.class)
public void whitespace_not_allowed_within_type() {
parseWKT("POIN T( 1 2)");
}
@Test(expected = IllegalArgumentException.class)
public void illegal_nested_multilinestring() {
parseWKT("multilinestring((1 1, 2 2), 3 3)");
}
@Test(expected = IllegalArgumentException.class)
public void illegal_double_zero() {
parseWKT("POINT(0 00)");
}
@Test
public void null_wkt_is_null_geometry() {
assertThat(parseWKT(null)).isNull();
}
@Test
public void empty_wkt_is_null_geometry() {
assertThat(parseWKT("")).isNull();
}
@Test
public void lower_case_geometries() {
assertThat(parseWKT("point(1 1)")).isInstanceOf(Point.class);
assertThat(parseWKT("linestring(1 1, 2 2)")).isInstanceOf(LineString.class);
assertThat(parseWKT("polygon((1 1, 2 2, 3 3, 1 1))")).isInstanceOf(Polygon.class);
assertThat(parseWKT("multipoint(1 1, 2 2, 3 3)")).isInstanceOf(MultiPoint.class);
assertThat(parseWKT("multilinestring((1 1, 2 2, 3 3), (4 4, 5 5, 6 6))")).isInstanceOf(MultiLineString.class);
assertThat(parseWKT("multipolygon(((1 1, 2 2, 3 3, 1 1)))")).isInstanceOf(MultiPolygon.class);
}
@Test
public void camel_case_geometries() {
assertThat(parseWKT("Point(1 1)")).isInstanceOf(Point.class);
assertThat(parseWKT("LineString(1 1, 2 2)")).isInstanceOf(LineString.class);
assertThat(parseWKT("Polygon((1 1, 2 2, 3 3, 1 1))")).isInstanceOf(Polygon.class);
assertThat(parseWKT("MultiPoint(1 1, 2 2, 3 3)")).isInstanceOf(MultiPoint.class);
assertThat(parseWKT("MultiLineString((1 1, 2 2, 3 3), (4 4, 5 5, 6 6))")).isInstanceOf(MultiLineString.class);
assertThat(parseWKT("MultiPolygon(((1 1, 2 2, 3 3, 1 1)))")).isInstanceOf(MultiPolygon.class);
}
@Test
public void point() {
assertPoint((Point) parseWKT("POINT(0.0123 123)"), 0.0123, 123);
}
@Test
public void negative_coordinates() {
assertPoint((Point) parseWKT("POINT(-0.1 -123)"), -0.1, -123);
}
@Test
public void lineString() {
LineString ls = (LineString) parseWKT("\tLINESTRING (30.0 10.10, 10 30, 40 40)\n");
assertPoint(ls.getPointN(0), 30, 10.1);
assertPoint(ls.getPointN(1), 10, 30);
assertPoint(ls.getPointN(2), 40, 40);
}
@Test
public void polygon() {
Polygon polygon = (Polygon) parseWKT("POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))");
assertThat(polygon.getNumInteriorRing()).isEqualTo(0);
assertPoint(polygon.getPointN(0), 30, 10);
assertPoint(polygon.getPointN(1), 40, 40);
assertPoint(polygon.getPointN(2), 20, 40);
assertPoint(polygon.getPointN(3), 10, 20);
assertPoint(polygon.getPointN(4), 30, 10);
}
@Test
public void polygon_with_hole() {
Polygon polygon = (Polygon) parseWKT("POLYGON ((35 10, 45 45, 15 40, 10 20, 35 10),\n" +
"(20 30, 35 35, 30 20, 20 30))");
assertThat(polygon.getNumInteriorRing()).isEqualTo(1);
assertPoint(polygon.getPointN(0), 35, 10);
assertPoint(polygon.getPointN(1), 45, 45);
assertPoint(polygon.getPointN(2), 15, 40);
assertPoint(polygon.getPointN(3), 10, 20);
assertPoint(polygon.getPointN(4), 35, 10);
assertPoint(polygon.getPointN(5), 20, 30);
assertPoint(polygon.getPointN(6), 35, 35);
assertPoint(polygon.getPointN(7), 30, 20);
assertPoint(polygon.getPointN(8), 20, 30);
}
@Test
public void multipoint1() {
MultiPoint polygon = (MultiPoint) parseWKT("MULTIPOINT ((10 40), (40 30), (20 20), (30 10))");
assertPoint(polygon.getPointN(0), 10, 40);
assertPoint(polygon.getPointN(1), 40, 30);
assertPoint(polygon.getPointN(2), 20, 20);
assertPoint(polygon.getPointN(3), 30, 10);
}
@Test
public void multipoint2() {
MultiPoint polygon = (MultiPoint) parseWKT("MULTIPOINT (10 40, 40 30, 20 20, 30 10)");
assertPoint(polygon.getPointN(0), 10, 40);
assertPoint(polygon.getPointN(1), 40, 30);
assertPoint(polygon.getPointN(2), 20, 20);
assertPoint(polygon.getPointN(3), 30, 10);
}
@Test
public void multilinestring() {
MultiLineString multiLineString = (MultiLineString) parseWKT("MULTILINESTRING ((35 10, 45 45, 15 40, 10 20, 35 10),\n" +
"(20 30, 35 35, 30 20, 20 30))");
assertPoint(multiLineString.getPointN(0), 35, 10);
assertPoint(multiLineString.getPointN(1), 45, 45);
assertPoint(multiLineString.getPointN(2), 15, 40);
assertPoint(multiLineString.getPointN(3), 10, 20);
assertPoint(multiLineString.getPointN(4), 35, 10);
assertPoint(multiLineString.getPointN(5), 20, 30);
assertPoint(multiLineString.getPointN(6), 35, 35);
assertPoint(multiLineString.getPointN(7), 30, 20);
assertPoint(multiLineString.getPointN(8), 20, 30);
}
@Test
public void multipolygon() {
MultiPolygon multiPolygon = (MultiPolygon) parseWKT(
"MULTIPOLYGON (((35 10, 45 45, 15 40, 10 20, 35 10)),\n" +
"((20 30, 35 35, 30 20, 20 30)))");
assertThat(multiPolygon.getNumGeometries()).isEqualTo(2);
assertPoint(multiPolygon.getPointN(0), 35, 10);
assertPoint(multiPolygon.getPointN(1), 45, 45);
assertPoint(multiPolygon.getPointN(2), 15, 40);
assertPoint(multiPolygon.getPointN(3), 10, 20);
assertPoint(multiPolygon.getPointN(4), 35, 10);
assertPoint(multiPolygon.getPointN(5), 20, 30);
assertPoint(multiPolygon.getPointN(6), 35, 35);
assertPoint(multiPolygon.getPointN(7), 30, 20);
assertPoint(multiPolygon.getPointN(8), 20, 30);
}
@Test
public void multipolygon_with_hole() {
MultiPolygon multiPolygon = (MultiPolygon) parseWKT(
"MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)),\n" +
"((20 35, 10 30, 10 10, 30 5, 45 20, 20 35),\n" +
"(30 20, 20 15, 20 25, 30 20)))");
assertThat(multiPolygon.getNumGeometries()).isEqualTo(2);
assertPoint(multiPolygon.getPointN(0), 40, 40);
assertPoint(multiPolygon.getPointN(1), 20, 45);
assertPoint(multiPolygon.getPointN(2), 45, 30);
assertPoint(multiPolygon.getPointN(3), 40, 40);
assertPoint(multiPolygon.getPointN(4), 20, 35);
assertPoint(multiPolygon.getPointN(5), 10, 30);
assertPoint(multiPolygon.getPointN(6), 10, 10);
assertPoint(multiPolygon.getPointN(7), 30, 5);
assertPoint(multiPolygon.getPointN(8), 45, 20);
assertPoint(multiPolygon.getPointN(9), 20, 35);
assertPoint(multiPolygon.getPointN(10), 30, 20);
assertPoint(multiPolygon.getPointN(11), 20, 15);
assertPoint(multiPolygon.getPointN(12), 20, 25);
assertPoint(multiPolygon.getPointN(13), 30, 20);
}
private void assertPoint(Point point, double x, double y) {
assertThat(point.getX()).isEqualTo(x);
assertThat(point.getY()).isEqualTo(y);
}
}