/* * Copyright 2015-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.data.mongodb.core.convert; import static org.hamcrest.core.IsEqual.*; import static org.hamcrest.core.IsNull.*; import static org.junit.Assert.*; import java.util.Arrays; import org.bson.Document; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; import org.springframework.data.geo.Point; import org.springframework.data.mongodb.core.convert.GeoConverters.DocumentToGeoJsonLineStringConverter; import org.springframework.data.mongodb.core.convert.GeoConverters.DocumentToGeoJsonMultiLineStringConverter; import org.springframework.data.mongodb.core.convert.GeoConverters.DocumentToGeoJsonMultiPointConverter; import org.springframework.data.mongodb.core.convert.GeoConverters.DocumentToGeoJsonMultiPolygonConverter; import org.springframework.data.mongodb.core.convert.GeoConverters.DocumentToGeoJsonPointConverter; import org.springframework.data.mongodb.core.convert.GeoConverters.DocumentToGeoJsonPolygonConverter; import org.springframework.data.mongodb.core.convert.GeoConverters.GeoJsonToDocumentConverter; import org.springframework.data.mongodb.core.geo.GeoJson; import org.springframework.data.mongodb.core.geo.GeoJsonGeometryCollection; import org.springframework.data.mongodb.core.geo.GeoJsonLineString; import org.springframework.data.mongodb.core.geo.GeoJsonMultiLineString; import org.springframework.data.mongodb.core.geo.GeoJsonMultiPoint; import org.springframework.data.mongodb.core.geo.GeoJsonMultiPolygon; import org.springframework.data.mongodb.core.geo.GeoJsonPoint; import org.springframework.data.mongodb.core.geo.GeoJsonPolygon; import org.springframework.data.mongodb.test.util.BasicDbListBuilder; import com.mongodb.BasicDBList; /** * @author Christoph Strobl */ @RunWith(Suite.class) @SuiteClasses({ GeoJsonConverterUnitTests.GeoJsonToDocumentConverterUnitTests.class, GeoJsonConverterUnitTests.DocumentToGeoJsonPointConverterUnitTests.class, GeoJsonConverterUnitTests.DocumentToGeoJsonPolygonConverterUnitTests.class, GeoJsonConverterUnitTests.DocumentToGeoJsonLineStringConverterUnitTests.class, GeoJsonConverterUnitTests.DocumentToGeoJsonMultiPolygonConverterUnitTests.class, GeoJsonConverterUnitTests.DocumentToGeoJsonMultiLineStringConverterUnitTests.class, GeoJsonConverterUnitTests.DocumentToGeoJsonMultiPointConverterUnitTests.class }) public class GeoJsonConverterUnitTests { /* * --- GeoJson */ static final GeoJsonPoint SINGLE_POINT = new GeoJsonPoint(100, 50); static final Point POINT_0 = new Point(0, 0); static final Point POINT_1 = new Point(100, 0); static final Point POINT_2 = new Point(100, 100); static final Point POINT_3 = new Point(0, 100); static final Point INNER_POINT_0 = new Point(10, 10); static final Point INNER_POINT_1 = new Point(90, 10); static final Point INNER_POINT_2 = new Point(90, 90); static final Point INNER_POINT_3 = new Point(10, 90); static final GeoJsonMultiPoint MULTI_POINT = new GeoJsonMultiPoint(POINT_0, POINT_2, POINT_3); static final GeoJsonLineString LINE_STRING = new GeoJsonLineString(POINT_0, POINT_1, POINT_2); @SuppressWarnings("unchecked") static final GeoJsonMultiLineString MULTI_LINE_STRING = new GeoJsonMultiLineString( Arrays.asList(POINT_0, POINT_1, POINT_2), Arrays.asList(POINT_3, POINT_0)); static final GeoJsonPolygon POLYGON = new GeoJsonPolygon(POINT_0, POINT_1, POINT_2, POINT_3, POINT_0); static final GeoJsonPolygon POLYGON_WITH_2_RINGS = POLYGON.withInnerRing(INNER_POINT_0, INNER_POINT_1, INNER_POINT_2, INNER_POINT_3, INNER_POINT_0); static final GeoJsonMultiPolygon MULTI_POLYGON = new GeoJsonMultiPolygon(Arrays.asList(POLYGON)); static final GeoJsonGeometryCollection GEOMETRY_COLLECTION = new GeoJsonGeometryCollection( Arrays.<GeoJson<?>> asList(SINGLE_POINT, POLYGON)); /* * -- GeoJson Documents */ // Point static final BasicDBList SINGE_POINT_CORDS = new BasicDbListBuilder() // .add(SINGLE_POINT.getX()) // .add(SINGLE_POINT.getY()) // .get(); // static final Document SINGLE_POINT_DOC = new Document() // .append("type", "Point") // .append("coordinates", SINGE_POINT_CORDS);// // MultiPoint static final BasicDBList MULTI_POINT_CORDS = new BasicDbListBuilder() // .add(new BasicDbListBuilder().add(POINT_0.getX()).add(POINT_0.getY()).get()) // .add(new BasicDbListBuilder().add(POINT_2.getX()).add(POINT_2.getY()).get()) // .add(new BasicDbListBuilder().add(POINT_3.getX()).add(POINT_3.getY()).get()) // .get(); static final Document MULTI_POINT_DOC = new Document() // .append("type", "MultiPoint")// .append("coordinates", MULTI_POINT_CORDS);// // Polygon static final BasicDBList POLYGON_OUTER_CORDS = new BasicDbListBuilder() // .add(new BasicDbListBuilder().add(POINT_0.getX()).add(POINT_0.getY()).get()) // .add(new BasicDbListBuilder().add(POINT_1.getX()).add(POINT_1.getY()).get()) // .add(new BasicDbListBuilder().add(POINT_2.getX()).add(POINT_2.getY()).get()) // .add(new BasicDbListBuilder().add(POINT_3.getX()).add(POINT_3.getY()).get()) // .add(new BasicDbListBuilder().add(POINT_0.getX()).add(POINT_0.getY()).get()) // .get(); static final BasicDBList POLYGON_INNER_CORDS = new BasicDbListBuilder() // .add(new BasicDbListBuilder().add(INNER_POINT_0.getX()).add(INNER_POINT_0.getY()).get()) // .add(new BasicDbListBuilder().add(INNER_POINT_1.getX()).add(INNER_POINT_1.getY()).get()) // .add(new BasicDbListBuilder().add(INNER_POINT_2.getX()).add(INNER_POINT_2.getY()).get()) // .add(new BasicDbListBuilder().add(INNER_POINT_3.getX()).add(INNER_POINT_3.getY()).get()) // .add(new BasicDbListBuilder().add(INNER_POINT_0.getX()).add(INNER_POINT_0.getY()).get()) // .get(); static final BasicDBList POLYGON_CORDS = new BasicDbListBuilder().add(POLYGON_OUTER_CORDS).get(); static final Document POLYGON_DOC = new Document() // .append("type", "Polygon") // .append("coordinates", POLYGON_CORDS); // static final BasicDBList POLYGON_WITH_2_RINGS_CORDS = new BasicDbListBuilder().add(POLYGON_OUTER_CORDS) .add(POLYGON_INNER_CORDS).get(); static final Document POLYGON_WITH_2_RINGS_DOC = new Document() // .append("type", "Polygon") // .append("coordinates", POLYGON_WITH_2_RINGS_CORDS); // LineString static final BasicDBList LINE_STRING_CORDS_0 = new BasicDbListBuilder() // .add(new BasicDbListBuilder().add(POINT_0.getX()).add(POINT_0.getY()).get()) // .add(new BasicDbListBuilder().add(POINT_1.getX()).add(POINT_1.getY()).get()) // .add(new BasicDbListBuilder().add(POINT_2.getX()).add(POINT_2.getY()).get()) // .get(); static final BasicDBList LINE_STRING_CORDS_1 = new BasicDbListBuilder() // .add(new BasicDbListBuilder().add(POINT_3.getX()).add(POINT_3.getY()).get()) // .add(new BasicDbListBuilder().add(POINT_0.getX()).add(POINT_0.getY()).get()) // .get(); static final Document LINE_STRING_DOC = new Document().append("type", "LineString").append("coordinates", LINE_STRING_CORDS_0); // MultiLineString static final BasicDBList MUILT_LINE_STRING_CORDS = new BasicDbListBuilder() // .add(LINE_STRING_CORDS_0) // .add(LINE_STRING_CORDS_1) // .get(); static final Document MULTI_LINE_STRING_DOC = new Document().append("type", "MultiLineString").append("coordinates", MUILT_LINE_STRING_CORDS); // MultiPolygoin static final BasicDBList MULTI_POLYGON_CORDS = new BasicDbListBuilder().add(POLYGON_CORDS).get(); static final Document MULTI_POLYGON_DOC = new Document().append("type", "MultiPolygon").append("coordinates", MULTI_POLYGON_CORDS); // GeometryCollection static final BasicDBList GEOMETRY_COLLECTION_GEOMETRIES = new BasicDbListBuilder() // .add(SINGLE_POINT_DOC)// .add(POLYGON_DOC)// .get(); static final Document GEOMETRY_COLLECTION_DOC = new Document().append("type", "GeometryCollection") .append("geometries", GEOMETRY_COLLECTION_GEOMETRIES); /** * @author Christoph Strobl */ public static class DocumentToGeoJsonPolygonConverterUnitTests { DocumentToGeoJsonPolygonConverter converter = DocumentToGeoJsonPolygonConverter.INSTANCE; public @Rule ExpectedException expectedException = ExpectedException.none(); @Test // DATAMONGO-1137 public void shouldConvertDboCorrectly() { assertThat(converter.convert(POLYGON_DOC), equalTo(POLYGON)); } @Test // DATAMONGO-1137 public void shouldReturnNullWhenConvertIsGivenNull() { assertThat(converter.convert(null), nullValue()); } @Test // DATAMONGO-1137 public void shouldThrowExceptionWhenTypeDoesNotMatchPolygon() { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("'YouDontKonwMe' to Polygon"); converter.convert(new Document("type", "YouDontKonwMe")); } @Test // DATAMONGO-1399 public void shouldConvertDboWithMultipleRingsCorrectly() { assertThat(converter.convert(POLYGON_WITH_2_RINGS_DOC), equalTo(POLYGON_WITH_2_RINGS)); } } /** * @author Christoph Strobl */ public static class DocumentToGeoJsonPointConverterUnitTests { DocumentToGeoJsonPointConverter converter = DocumentToGeoJsonPointConverter.INSTANCE; public @Rule ExpectedException expectedException = ExpectedException.none(); @Test // DATAMONGO-1137 public void shouldConvertDboCorrectly() { assertThat(converter.convert(SINGLE_POINT_DOC), equalTo(SINGLE_POINT)); } @Test // DATAMONGO-1137 public void shouldReturnNullWhenConvertIsGivenNull() { assertThat(converter.convert(null), nullValue()); } @Test // DATAMONGO-1137 public void shouldThrowExceptionWhenTypeDoesNotMatchPoint() { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("'YouDontKonwMe' to Point"); converter.convert(new Document("type", "YouDontKonwMe")); } } /** * @author Christoph Strobl */ public static class DocumentToGeoJsonLineStringConverterUnitTests { DocumentToGeoJsonLineStringConverter converter = DocumentToGeoJsonLineStringConverter.INSTANCE; public @Rule ExpectedException expectedException = ExpectedException.none(); @Test // DATAMONGO-1137 public void shouldConvertDboCorrectly() { assertThat(converter.convert(LINE_STRING_DOC), equalTo(LINE_STRING)); } @Test // DATAMONGO-1137 public void shouldReturnNullWhenConvertIsGivenNull() { assertThat(converter.convert(null), nullValue()); } @Test // DATAMONGO-1137 public void shouldThrowExceptionWhenTypeDoesNotMatchPoint() { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("'YouDontKonwMe' to LineString"); converter.convert(new Document("type", "YouDontKonwMe")); } } /** * @author Christoph Strobl */ public static class DocumentToGeoJsonMultiLineStringConverterUnitTests { DocumentToGeoJsonMultiLineStringConverter converter = DocumentToGeoJsonMultiLineStringConverter.INSTANCE; public @Rule ExpectedException expectedException = ExpectedException.none(); @Test // DATAMONGO-1137 public void shouldConvertDboCorrectly() { assertThat(converter.convert(MULTI_LINE_STRING_DOC), equalTo(MULTI_LINE_STRING)); } @Test // DATAMONGO-1137 public void shouldReturnNullWhenConvertIsGivenNull() { assertThat(converter.convert(null), nullValue()); } @Test // DATAMONGO-1137 public void shouldThrowExceptionWhenTypeDoesNotMatchPoint() { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("'YouDontKonwMe' to MultiLineString"); converter.convert(new Document("type", "YouDontKonwMe")); } } /** * @author Christoph Strobl */ public static class DocumentToGeoJsonMultiPointConverterUnitTests { DocumentToGeoJsonMultiPointConverter converter = DocumentToGeoJsonMultiPointConverter.INSTANCE; public @Rule ExpectedException expectedException = ExpectedException.none(); @Test // DATAMONGO-1137 public void shouldConvertDboCorrectly() { assertThat(converter.convert(MULTI_POINT_DOC), equalTo(MULTI_POINT)); } @Test // DATAMONGO-1137 public void shouldReturnNullWhenConvertIsGivenNull() { assertThat(converter.convert(null), nullValue()); } @Test // DATAMONGO-1137 public void shouldThrowExceptionWhenTypeDoesNotMatchPoint() { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("'YouDontKonwMe' to MultiPoint"); converter.convert(new Document("type", "YouDontKonwMe")); } } /** * @author Christoph Strobl */ public static class DocumentToGeoJsonMultiPolygonConverterUnitTests { DocumentToGeoJsonMultiPolygonConverter converter = DocumentToGeoJsonMultiPolygonConverter.INSTANCE; public @Rule ExpectedException expectedException = ExpectedException.none(); @Test // DATAMONGO-1137 public void shouldConvertDboCorrectly() { assertThat(converter.convert(MULTI_POLYGON_DOC), equalTo(MULTI_POLYGON)); } @Test // DATAMONGO-1137 public void shouldReturnNullWhenConvertIsGivenNull() { assertThat(converter.convert(null), nullValue()); } @Test // DATAMONGO-1137 public void shouldThrowExceptionWhenTypeDoesNotMatchPoint() { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("'YouDontKonwMe' to MultiPolygon"); converter.convert(new Document("type", "YouDontKonwMe")); } } /** * @author Christoph Strobl */ public static class GeoJsonToDocumentConverterUnitTests { GeoJsonToDocumentConverter converter = GeoJsonToDocumentConverter.INSTANCE; // DATAMONGO-1135 public void convertShouldReturnNullWhenGivenNull() { assertThat(converter.convert(null), nullValue()); } @Test // DATAMONGO-1135 public void shouldConvertGeoJsonPointCorrectly() { assertThat(converter.convert(SINGLE_POINT), equalTo(SINGLE_POINT_DOC)); } @Test // DATAMONGO-1135 public void shouldConvertGeoJsonPolygonCorrectly() { assertThat(converter.convert(POLYGON), equalTo(POLYGON_DOC)); } @Test // DATAMONGO-1137 public void shouldConvertGeoJsonLineStringCorrectly() { assertThat(converter.convert(LINE_STRING), equalTo(LINE_STRING_DOC)); } @Test // DATAMONGO-1137 public void shouldConvertGeoJsonMultiLineStringCorrectly() { assertThat(converter.convert(MULTI_LINE_STRING), equalTo(MULTI_LINE_STRING_DOC)); } @Test // DATAMONGO-1137 public void shouldConvertGeoJsonMultiPointCorrectly() { assertThat(converter.convert(MULTI_POINT), equalTo(MULTI_POINT_DOC)); } @Test // DATAMONGO-1137 public void shouldConvertGeoJsonMultiPolygonCorrectly() { assertThat(converter.convert(MULTI_POLYGON), equalTo(MULTI_POLYGON_DOC)); } @Test // DATAMONGO-1137 public void shouldConvertGeometryCollectionCorrectly() { assertThat(converter.convert(GEOMETRY_COLLECTION), equalTo(GEOMETRY_COLLECTION_DOC)); } @Test // DATAMONGO-1399 public void shouldConvertGeoJsonPolygonWithMultipleRingsCorrectly() { assertThat(converter.convert(POLYGON_WITH_2_RINGS), equalTo(POLYGON_WITH_2_RINGS_DOC)); } } }