/*-
* Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
*
* This file is part of CityDoctor2.
*
* CityDoctor2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* CityDoctor2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with CityDoctor2. If not, see .
*/
package de.hft.stuttgart.citydoctor2.datastructure;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import org.citygml4j.factory.GMLGeometryFactory;
import org.citygml4j.model.citygml.building.AbstractBoundarySurface;
import org.citygml4j.model.citygml.building.WallSurface;
import org.junit.Test;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing.LinearRingType;
import de.hft.stuttgart.citydoctor2.math.Vector3d;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
/**
*
* @author Matthias Betz
*
*/
public class GeometryTest {
@Test
public void testCreate() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD0);
assertNotNull(geom);
assertSame(GeometryType.SOLID, geom.getType());
assertSame(Lod.LOD0, geom.getLod());
}
@Test
public void testAddPolygon() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD0);
Polygon p = new ConcretePolygon();
geom.addPolygon(p);
assertEquals(1, geom.getPolygons().size());
assertSame(geom, p.getParent());
assertSame(geom.getPolygons().get(0), p);
}
@Test
public void testRemovePolygon() {
ParserConfiguration config = new ParserConfiguration(4, false);
AbstractBoundarySurface abs = new WallSurface();
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, abs);
org.citygml4j.model.citygml.building.BuildingInstallation gmlBi = new org.citygml4j.model.citygml.building.BuildingInstallation();
BuildingInstallation bi = new BuildingInstallation();
bi.setGmlObject(gmlBi);
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2);
Polygon p = new ConcretePolygon();
LinearRing lr = new LinearRing(LinearRingType.EXTERIOR);
p.setExteriorRing(lr);
lr.addVertex(new Vertex(0, 0, 0));
geom.addPolygon(p);
p.setPartOfSurface(bs);
p.setPartOfInstallation(bi);
geom.removePolygon(p);
assertEquals(0, geom.getPolygons().size());
bs.reCreateGeometries(new GMLGeometryFactory(), config);
assertNull(abs.getLod2MultiSurface());
bi.reCreateGeometries(new GMLGeometryFactory(), config);
assertNull(gmlBi.getLod2Geometry());
}
@Test
public void testReplacePolygon() {
ParserConfiguration config = new ParserConfiguration(4, false);
AbstractBoundarySurface abs = new WallSurface();
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, abs);
org.citygml4j.model.citygml.building.BuildingInstallation gmlBi = new org.citygml4j.model.citygml.building.BuildingInstallation();
BuildingInstallation bi = new BuildingInstallation();
bi.setGmlObject(gmlBi);
bi.addBoundarySurface(bs);
Geometry geom2 = new Geometry(GeometryType.MULTI_SURFACE, Lod.LOD2);
ConcretePolygon p = new ConcretePolygon();
geom2.addPolygon(p);
LinearRing lr = new LinearRing(LinearRingType.EXTERIOR);
p.setExteriorRing(lr);
lr.addVertex(new Vertex(0, 0, 0));
p.setPartOfSurface(bs);
p.setPartOfInstallation(bi);
bs.addGeometry(geom2);
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2);
Polygon linkedPoly = new LinkedPolygon(p, geom);
geom.addPolygon(linkedPoly);
ConcretePolygon p2 = new ConcretePolygon();
p2.setExteriorRing(lr);
ConcretePolygon p3 = new ConcretePolygon();
p3.setExteriorRing(lr);
geom.replacePolygon(linkedPoly, p2, p3);
assertEquals(2, geom.getPolygons().size());
assertEquals(2, geom2.getPolygons().size());
bi.reCreateGeometries(new GMLGeometryFactory(), config);
assertNull(gmlBi.getLod2Geometry());
assertNull(gmlBi.getLod3Geometry());
assertNull(gmlBi.getLod4Geometry());
bs.reCreateGeometries(new GMLGeometryFactory(), config);
assertNotNull(abs.getLod2MultiSurface());
assertNotNull(abs.getLod2MultiSurface().getMultiSurface());
assertNotNull(abs.getLod2MultiSurface().getMultiSurface().getSurfaceMember());
assertFalse(abs.getLod2MultiSurface().getMultiSurface().getSurfaceMember().isEmpty());
assertEquals(2, abs.getLod2MultiSurface().getMultiSurface().getSurfaceMember().size());
assertNull(gmlBi.getLod2Geometry());
}
@Test
public void testSetParent() {
Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, Lod.LOD2);
CityObject co = mock(CityObject.class);
geom.setParent(co);
assertEquals(co, geom.getParent());
}
@Test
public void testUpdateEdges() {
Geometry geom = GeometryTestUtils.createDummyGeometryWithInnerRingWithNeighboringPolygon(GeometryType.SOLID,
Lod.LOD2);
geom.clearMetaInformation();
assertNull(geom.getEdges());
geom.updateEdges();
List edges = geom.getEdges();
assertNotNull(edges);
assertFalse(edges.isEmpty());
assertEquals(10, edges.size());
}
@Test
public void testSetType() {
Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, Lod.LOD2);
geom.setType(GeometryType.SOLID);
assertEquals(GeometryType.SOLID, geom.getType());
}
@Test
public void testGetCenter() {
Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.SOLID);
Vector3d center = geom.getCenter();
assertEquals(427583.3025, center.getX(), 0.000001);
assertEquals(6003502.5725, center.getY(), 0.000001);
assertEquals(6.905, center.getZ(), 0.000001);
}
@Test
public void testContainsError() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1);
assertFalse(geom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
geom.addCheckResult(
new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(geom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
ConcretePolygon p = new ConcretePolygon();
p.setExteriorRing(mock(LinearRing.class));
geom.addPolygon(p);
assertFalse(geom.containsError(CheckId.C_GE_P_INNER_RINGS_NESTED));
p.addCheckResult(
new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(geom.containsError(CheckId.C_GE_P_INNER_RINGS_NESTED));
}
@Test
public void testClearAllContainedCheckResults() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1);
assertFalse(geom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
geom.addCheckResult(
new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(geom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
Polygon p = mock(Polygon.class);
geom.addPolygon(p);
geom.clearAllContainedCheckResults();
verify(p).clearAllContainedCheckResults();
assertFalse(geom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
}
@Test
public void testCollectContainedErrors() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1);
assertFalse(geom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
geom.addCheckResult(
new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(geom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
Polygon p = mock(Polygon.class);
geom.addPolygon(p);
List errors = new ArrayList<>();
geom.collectContainedErrors(errors);
verify(p).collectContainedErrors(errors);
assertEquals(1, errors.size());
}
@Test
public void testContainsAnyError() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1);
assertFalse(geom.containsAnyError());
geom.addCheckResult(
new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(geom.containsAnyError());
Polygon p = mock(Polygon.class);
geom.addPolygon(p);
geom.clearAllContainedCheckResults();
assertFalse(geom.containsAnyError());
verify(p).containsAnyError();
when(p.containsAnyError()).thenReturn(true);
assertTrue(geom.containsAnyError());
}
@Test
public void testAccept() {
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1);
Check c = mock(Check.class);
geom.accept(c);
when(c.canExecute(geom)).thenReturn(true);
geom.accept(c);
verify(c).check(geom);
Polygon p = mock(Polygon.class);
geom.addPolygon(p);
geom.accept(c);
verify(p).accept(c);
}
@Test
public void testGetVertices() {
Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.SOLID);
List vertices = geom.getVertices();
assertEquals(4, vertices.size());
}
@Test
public void testGetEdgesAdjacentToVertex() {
Geometry geom = GeometryTestUtils.createDummyGeometryWithInnerRingWithNeighboringPolygon(GeometryType.SOLID, Lod.LOD1);
Polygon polygon = geom.getPolygons().get(1);
Vertex vertex = polygon.getExteriorRing().getVertices().get(0);
List edges = geom.getEdgesAdjacentTo(vertex);
assertEquals(2, edges.size());
}
}