/*- * 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()); } }