Commit d1ff5020 authored by Beuster's avatar Beuster
Browse files

Merge remote-tracking branch 'origin/dev' into dev_cpp_code_conversion

parents 06ad5a8e b50c5f13
Pipeline #11130 passed with stage
in 1 minute and 28 seconds
......@@ -27,6 +27,7 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Copy {
......@@ -36,7 +37,7 @@ public class Copy {
}
@SuppressWarnings("unchecked")
public static <T extends Copyable> T copy(T original) {
public static <T extends Serializable> T copy(T original) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ObjectOutputStream oos = new ObjectOutputStream(out);
......
/*-
* 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 <https://www.gnu.org/licenses/>.
*/
package de.hft.stuttgart.citydoctor2.utils;
import java.util.Collection;
import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class CopyHandler {
private final Set<Copyable> toBeDoneInstances = new HashSet<>();
private final Map<Copyable, Copyable> finishedInstances = new IdentityHashMap<>();
@SuppressWarnings("unchecked")
public <T extends Copyable> T copy(T original) {
toBeDoneInstances.add(original);
while (!toBeDoneInstances.isEmpty()) {
handleNextInstance();
}
for (Entry<Copyable, Copyable> e : finishedInstances.entrySet()) {
e.getValue().fillValues(e.getKey(), this);
}
return (T) finishedInstances.get(original);
}
@SuppressWarnings("unchecked")
public <T extends Copyable> T getCopyInstance(T original) {
if (original == null) {
// null gets copied to null
return null;
}
return (T) finishedInstances.get(original);
}
public void addInstance(Copyable copyable) {
if (copyable == null) {
// don't care for null instances
return;
}
if (finishedInstances.containsKey(copyable)) {
// already processed
return;
}
toBeDoneInstances.add(copyable);
}
private void handleNextInstance() {
Iterator<Copyable> iterator = toBeDoneInstances.iterator();
Copyable next = iterator.next();
iterator.remove();
finishedInstances.put(next, next.createCopyInstance());
next.collectInstances(this);
}
public void addInstance(Collection<? extends Copyable> collection) {
if (collection == null) {
return;
}
for (Copyable c : collection) {
addInstance(c);
}
}
}
/*-
* 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 <https://www.gnu.org/licenses/>.
*/
package de.hft.stuttgart.citydoctor2.utils;
public interface Copyable {
public void collectInstances(CopyHandler handler);
public Copyable createCopyInstance();
public void fillValues(Copyable original, CopyHandler handler);
}
package de.hft.stuttgart.citydoctor2.utils;
public class ThrowUtils {
private ThrowUtils() {
}
@SuppressWarnings("unchecked")
private static <T extends Throwable> void uncheckThrowable(Throwable t) throws T {
throw (T) t;
}
/**
* Throws a Throwable as an unchecked generic Throwable
*/
public static void sneakyThrow(Throwable t) {
uncheckThrowable(t);
}
}
package de.hft.stuttgart.citydoctor2.utils.visitors;
import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.Checkable;
import java.util.List;
/**
* This Visitor collects all CheckErrors in the datastructure of a checkable.
*/
public class CheckableErrorCollector extends CheckableUtilsVisitor {
List<CheckError> errors;
/**
* Collects all CheckErrors into a list
*
* @param errors the list
*/
public CheckableErrorCollector(List<CheckError> errors) {
this.errors = errors;
}
@Override
public void check(Checkable checkable) {
checkable.collectErrors(errors);
}
}
package de.hft.stuttgart.citydoctor2.utils.visitors;
import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import java.util.HashSet;
import java.util.Set;
/**
* This Visitor collects all sub-CityObjects that are in the datastructure of a CityObject (including itself) in a Set.
*/
public class CityObjectCollector extends CheckableUtilsVisitor {
private final Set<CityObject> objects = new HashSet<>();
/**
* Returns the collected CityObjects.
*
* @return A set of CityObjects
*/
public Set<CityObject> getCityObjects() {
return objects;
}
@Override
public void check(CityObject co) {
objects.add(co);
}
}
package de.hft.stuttgart.citydoctor2.utils.visitors;
import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
/**
* This Visitor removes the metadata created by the {@link PrepareForCheckingVisitor} for the low-memory consumption mode.
*/
public class ClearMetaInformationVisitor extends CheckableUtilsVisitor {
@Override
public void check(Geometry geometry) {
geometry.clearMetaData();
}
}
package de.hft.stuttgart.citydoctor2.utils.visitors;
import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor;
import de.hft.stuttgart.citydoctor2.check.Checkable;
/**
* This Visitor removes the check results from a CityObject and the objects in its datastructure.
*/
public class ClearVisitorResultsVisitor extends CheckableUtilsVisitor {
@Override
public void check(Checkable checkable) {
checkable.clearCheckResults();
}
}
package de.hft.stuttgart.citydoctor2.utils.visitors;
import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor;
import de.hft.stuttgart.citydoctor2.check.Checkable;
import de.hft.stuttgart.citydoctor2.utils.CheckErrorFound;
import de.hft.stuttgart.citydoctor2.utils.ThrowUtils;
/**
* This visitor checks if a checkable contains any error in its datastructure.
* <p><p/>
* This visitor's check method terminates early by throwing an unchecked {@link CheckErrorFound},
* use {@link #checkObject(Checkable) ContainsAnyErrorVisitor.checkObject(Checkable)} to handle the Throwable.
*/
public class ContainsAnyErrorVisitor extends CheckableUtilsVisitor {
/**
* Checks if a Checkable, or any Object in its datastructure, contains any error.
* <p>
* Terminates early upon finding an error by throwing {@link CheckErrorFound}
*
* @param checkable The object to check
* @throws CheckErrorFound when any Error is found
*/
public static void checkObject(Checkable checkable) throws CheckErrorFound {
checkable.accept(new ContainsAnyErrorVisitor());
}
@Override
public void check(Checkable checkable) {
if (checkable.hasAnyError()) {
ThrowUtils.sneakyThrow(new CheckErrorFound());
}
}
}
package de.hft.stuttgart.citydoctor2.utils.visitors;
import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.Checkable;
import de.hft.stuttgart.citydoctor2.utils.CheckErrorFound;
import de.hft.stuttgart.citydoctor2.utils.ThrowUtils;
/**
* This visitor checks if a checkable contains a specific error in its datastructure.
* <p><p/>
* This visitor's check method terminates early by throwing an unchecked {@link CheckErrorFound},
* use {@link #checkObject(Checkable, CheckId) ContainsAnyErrorVisitor.checkObject(Checkable, CheckId)} to handle the Throwable.
*/
public class ContainsErrorVisitor extends CheckableUtilsVisitor {
private CheckId checkId;
/**
* Checks if a Checkable, or any Object in its datastructure, contains a specific error.
* <p>
* Terminates early upon finding the error by throwing {@link CheckErrorFound}
*
* @param checkable The object to check
* @param checkIdentifier The specific error's associated ID
* @throws CheckErrorFound when the error is found
*/
public static void checkObject(Checkable checkable, CheckId checkIdentifier) throws CheckErrorFound {
checkable.accept(new ContainsErrorVisitor(checkIdentifier));
}
@Override
public void check(Checkable checkable) {
if (checkable.hasError(checkId)) {
ThrowUtils.sneakyThrow(new CheckErrorFound());
}
}
public ContainsErrorVisitor(CheckId checkIdentifier) {
super();
checkId = checkIdentifier;
}
}
package de.hft.stuttgart.citydoctor2.utils.visitors;
import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import org.citygml4j.core.util.geometry.GeometryFactory;
import java.util.Objects;
/**
* This Visitor recreates the Geometries of the original CityGml object from the associated Geometries in CityDoctor's
* internal model.
*/
public class GmlGeometryRebuilder extends CheckableUtilsVisitor {
private final GeometryFactory factory;
private final ParserConfiguration config;
/**
* Creates a new Rebuilder for reconstruction of CityGml geometries.
*
* @param factory the GeometryFactory used for creation of CityGml geometry objects.
* @param configuration the configuration settings of the parser
*/
public GmlGeometryRebuilder(GeometryFactory factory, ParserConfiguration configuration) {
Objects.requireNonNull(factory);
Objects.requireNonNull(configuration);
this.factory = factory;
this.config = configuration;
}
@Override
public void check(CityObject cityObject) {
cityObject.rebuildGeometries(factory, config);
}
}
package de.hft.stuttgart.citydoctor2.utils.visitors;
import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
/**
* This Visitor prepares the {@link Geometry Geometries} in a Checkable for low-memory consumption mode.
*/
public class PrepareForCheckingVisitor extends CheckableUtilsVisitor {
@Override
public void check(Geometry geom) {
geom.updateEdgesAndVertices();
}
}
package de.hft.stuttgart.citydoctor2.utils.visitors;
import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
/**
* This Visitor removes the GmlGeometries from the linked original GmlObjects in a CityObject's datastructure to reduce
* memory bloat.
*/
public class UnsetGeometriesVisitor extends CheckableUtilsVisitor {
@Override
public void check(CityObject cityObject) {
cityObject.unsetGmlGeometries();
}
}
......@@ -48,20 +48,6 @@ public class CheckableTest {
return null;
}
@Override
public void prepareForChecking() {
}
@Override
public void clearMetaInformation() {
}
@Override
public void clearAllContainedCheckResults() {
}
@Override
public Class<? extends Checkable> getCheckClass() {
return Building.class;
......
......@@ -23,36 +23,33 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import de.hft.stuttgart.citydoctor2.utils.visitors.GmlGeometryRebuilder;
import org.citygml4j.core.model.construction.WallSurface;
import org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty;
import org.citygml4j.core.util.geometry.GeometryFactory;
import org.junit.Test;
import org.mockito.Mockito;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
import org.xmlobjects.gml.model.geometry.primitives.AbstractRing;
import org.xmlobjects.gml.model.geometry.primitives.AbstractSolid;
import org.xmlobjects.gml.model.geometry.primitives.AbstractSurface;
import org.xmlobjects.gml.model.geometry.primitives.Shell;
import org.xmlobjects.gml.model.geometry.primitives.Solid;
import org.xmlobjects.gml.model.geometry.primitives.SolidProperty;
import org.xmlobjects.gml.model.geometry.primitives.SurfaceProperty;
import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor;
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.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.Copyable;
public class AbstractBuildingTest {
@Test
public void testAccept() {
AbstractBuilding ab = createAbstractBuilding();
......@@ -62,7 +59,7 @@ public class AbstractBuildingTest {
AtomicInteger abCounter = new AtomicInteger(0);
AtomicInteger bsCounter = new AtomicInteger(0);
AtomicInteger biCounter = new AtomicInteger(0);
AbstractCheck c = new AbstractCheck() {
CheckableUtilsVisitor c = new CheckableUtilsVisitor() {
@Override
public void check(AbstractBuilding ab) {
......@@ -79,7 +76,7 @@ public class AbstractBuildingTest {
assertEquals(1, bsCounter.intValue());
assertEquals(0, biCounter.intValue());
AbstractCheck c2 = new AbstractCheck() {
CheckableUtilsVisitor c2 = new CheckableUtilsVisitor() {
@Override
public void check(Installation bi) {
......@@ -91,73 +88,59 @@ public class AbstractBuildingTest {
}
@Test
public void testPrepareForChecking() {
Installation biMock = mock(Installation.class);
BoundarySurface bsMock = mock(BoundarySurface.class);
public void testVisitorPropagation() {
AbstractBuilding ab = createAbstractBuilding();
ab.addBoundarySurface(bsMock);
ab.addBuildingInstallation(biMock);
ab.prepareForChecking();
Mockito.verify(biMock, Mockito.times(1)).prepareForChecking();
Mockito.verify(bsMock, Mockito.times(1)).prepareForChecking();
}
@Test
public void testClearMetaInformation() {
Installation biMock = mock(Installation.class);
BoundarySurface bsMock = mock(BoundarySurface.class);
BuildingRoom mockRoom = mock(BuildingRoom.class);
Installation mockInstallation = mock(Installation.class);
BuildingRoomFurniture mockBuildingRoomFurniture = mock(BuildingRoomFurniture.class);
BuildingUnit mockBuildingUnit = mock(BuildingUnit.class);
Storey mockStorey = mock(Storey.class);
BoundarySurface mockBSurface = mock(BoundarySurface.class);
Geometry mockGeometry = mock(Geometry.class);
ab.addBuildingRoom(mockRoom);
ab.addBuildingInstallation(mockInstallation);
ab.addBuildingRoomFurniture(mockBuildingRoomFurniture);
ab.addBuildingUnit(mockBuildingUnit);
ab.addStorey(mockStorey);
ab.addBoundarySurface(mockBSurface);
ab.addGeometry(mockGeometry);
CheckableUtilsVisitor c = new CheckableUtilsVisitor() {
};
ab.accept(c);
AbstractBuilding ab = createAbstractBuilding();
ab.addBoundarySurface(bsMock);
ab.addBuildingInstallation(biMock);
ab.clearMetaInformation();
Mockito.verify(biMock, Mockito.times(1)).clearMetaInformation();
Mockito.verify(bsMock, Mockito.times(1)).clearMetaInformation();
verify(mockRoom).accept(c);
verify(mockInstallation).accept(c);
verify(mockBuildingRoomFurniture).accept(c);
verify(mockBuildingUnit).accept(c);
verify(mockStorey).accept(c);
verify(mockBSurface).accept(c);
verify(mockGeometry).accept(c);
}
@Test
public void testContainsError() {
AbstractBuilding ab = createAbstractBuilding();
assertFalse(ab.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
assertFalse(ab.containsError(CheckId.C_GE_P_NON_PLANAR));
ab.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(ab.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
}
@Test
public void testContainsErrorInBs() {
AbstractBuilding ab = createAbstractBuilding();
BoundarySurface bsMock = mock(BoundarySurface.class);
ab.addBoundarySurface(bsMock);
assertFalse(ab.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
Mockito.when(bsMock.containsError(CheckId.C_GE_P_HOLE_OUTSIDE)).thenReturn(true);
assertFalse(ab.containsError(CheckId.C_GE_P_NON_PLANAR));
ab.addCheckResult(new CheckResult(CheckId.C_GE_P_NON_PLANAR, ResultStatus.OK, mock(CheckError.class)));
assertTrue(ab.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
assertFalse(ab.containsError(CheckId.C_GE_P_NON_PLANAR));
}
@Test
public void testContainsErrorInBi() {
AbstractBuilding ab = createAbstractBuilding();
Installation biMock = mock(Installation.class);
ab.addBuildingInstallation(biMock);
assertFalse(ab.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
Mockito.when(biMock.containsError(CheckId.C_GE_P_HOLE_OUTSIDE)).thenReturn(true);
assertTrue(ab.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
}
@Test
public void testClearAllContainedCheckResults() {
Installation biMock = mock(Installation.class);
BoundarySurface bsMock = mock(BoundarySurface.class);
AbstractBuilding ab = createAbstractBuilding();
assertTrue(ab.getAllCheckResults().isEmpty());
ab.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
ab.addBoundarySurface(bsMock);
ab.addBuildingInstallation(biMock);
assertEquals(1, ab.getAllCheckResults().size());
ab.clearAllContainedCheckResults();
Mockito.verify(biMock, Mockito.times(1)).clearAllContainedCheckResults();
Mockito.verify(bsMock, Mockito.times(1)).clearAllContainedCheckResults();
assertTrue(ab.getAllCheckResults().isEmpty());
}
......@@ -172,85 +155,59 @@ public class AbstractBuildingTest {
assertTrue(ab.containsAnyError());
}
@Test
public void testContainsAnyErrorInBs() {
AbstractBuilding ab = createAbstractBuilding();
BoundarySurface bsMock = mock(BoundarySurface.class);
ab.addBoundarySurface(bsMock);
assertFalse(ab.containsAnyError());
Mockito.when(bsMock.containsAnyError()).thenReturn(true);
assertTrue(ab.containsAnyError());
}
@Test
public void testContainsAnyErrorInBi() {
AbstractBuilding ab = createAbstractBuilding();
Installation biMock = mock(Installation.class);
ab.addBuildingInstallation(biMock);
assertFalse(ab.containsAnyError());
Mockito.when(biMock.containsAnyError()).thenReturn(true);
assertTrue(ab.containsAnyError());
}
@Test
public void testCollectContainedErrors() {
Installation biMock = mock(Installation.class);
BoundarySurface bsMock = mock(BoundarySurface.class);
AbstractBuilding ab = createAbstractBuilding();
ab.addBoundarySurface(bsMock);
ab.addBuildingInstallation(biMock);
ab.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
List<CheckError> errors = new ArrayList<>();
ab.collectContainedErrors(errors);
Mockito.verify(biMock, Mockito.times(1)).collectContainedErrors(errors);
Mockito.verify(bsMock, Mockito.times(1)).collectContainedErrors(errors);
assertEquals(1, errors.size());
}
@Test
public void testReCreateGeometriesSolid() {
Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.SOLID);
AbstractBuilding ab = createAbstractBuilding();
org.citygml4j.core.model.building.AbstractBuilding gmlAb = new org.citygml4j.core.model.building.Building();
ab.setCityGmlBuilding(gmlAb);
ab.addGeometry(geom);
ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1));
ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2));
ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3));
ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD4));
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
ab.reCreateGeometries(factory, config);
AbstractSolid aSolid = gmlAb.getLod2Solid().getObject();
assertTrue(aSolid instanceof Solid);
Solid solid = (Solid) aSolid;
Shell geometry = solid.getExterior().getObject();
List<SurfaceProperty> surfaceMember = geometry.getSurfaceMembers();
assertEquals(1, surfaceMember.size());
AbstractSurface polySurface = surfaceMember.get(0).getObject();
assertTrue(polySurface instanceof org.xmlobjects.gml.model.geometry.primitives.Polygon);
var gmlPoly = (org.xmlobjects.gml.model.geometry.primitives.Polygon) polySurface;
AbstractRing ring = gmlPoly.getExterior().getObject();
var gmlRing = (org.xmlobjects.gml.model.geometry.primitives.LinearRing) ring;
List<Double> posList = gmlRing.toCoordinateList3D();
double[] expectedValues = new double[] { 427583.301, 6003502.571, 9.711, 427583.304, 6003502.574, 9.713,
427583.304, 6003502.574, 4.097, 427583.301, 6003502.571, 4.097, 427583.301, 6003502.571, 9.711 };
for (int i = 0; i < posList.size(); i++) {
assertEquals(expectedValues[i], posList.get(i), 0.00000001);
}
GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAb.getLod1Solid().getObject());
GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAb.getLod2Solid().getObject());
GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAb.getLod3Solid().getObject());
GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAb.getDeprecatedProperties().getLod4Solid().getObject());
}
@Test
public void testReCreateGeometriesMultiSurface() {
Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE);
AbstractBuilding ab = createAbstractBuilding();
org.citygml4j.core.model.building.AbstractBuilding gmlAb = new org.citygml4j.core.model.building.Building();
ab.setCityGmlBuilding(gmlAb);
ab.addGeometry(geom);
ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
ab.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
ab.reCreateGeometries(factory, config);
assertNotNull(gmlAb.getLod0MultiSurface());
assertNotNull(gmlAb.getLod0MultiSurface().getObject());
assertNotNull(gmlAb.getDeprecatedProperties().getLod1MultiSurface());
assertNotNull(gmlAb.getDeprecatedProperties().getLod1MultiSurface().getObject());
assertNotNull(gmlAb.getLod2MultiSurface());
assertNotNull(gmlAb.getLod2MultiSurface().getObject());
assertNotNull(gmlAb.getLod3MultiSurface());
assertNotNull(gmlAb.getLod3MultiSurface().getObject());
assertNotNull(gmlAb.getDeprecatedProperties().getLod4MultiSurface());
assertNotNull(gmlAb.getDeprecatedProperties().getLod4MultiSurface().getObject());
}
@Test
......@@ -266,7 +223,7 @@ public class AbstractBuildingTest {
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
ab.reCreateGeometries(factory, config);
Mockito.verify(bsMock).reCreateGeometries(factory, config);
Mockito.verify(bsMock).accept(any(GmlGeometryRebuilder.class));
}
@Test
......@@ -299,18 +256,15 @@ public class AbstractBuildingTest {
org.citygml4j.core.model.building.AbstractBuilding gmlAb = new org.citygml4j.core.model.building.Building();
ab.setCityGmlBuilding(gmlAb);
ab.reCreateGeometries(factory, config);
Mockito.verify(biMock).reCreateGeometries(factory, config);
Mockito.verify(biMock).accept(any(GmlGeometryRebuilder.class));
}
@Test
public void testUnsetGmlGeometries() {
Installation biMock = mock(Installation.class);
BoundarySurface bsMock = mock(BoundarySurface.class);
AbstractBuilding ab = createAbstractBuilding();
ab.addBoundarySurface(bsMock);
ab.addBuildingInstallation(biMock);
org.citygml4j.core.model.building.AbstractBuilding gmlAb = new org.citygml4j.core.model.building.Building();
ab.setCityGmlBuilding(gmlAb);
gmlAb.setLod1Solid(new SolidProperty());
gmlAb.setLod2Solid(new SolidProperty());
gmlAb.setLod3Solid(new SolidProperty());
......@@ -319,10 +273,9 @@ public class AbstractBuildingTest {
gmlAb.setLod2MultiSurface(new MultiSurfaceProperty());
gmlAb.setLod3MultiSurface(new MultiSurfaceProperty());
gmlAb.getDeprecatedProperties().setLod4MultiSurface(new MultiSurfaceProperty());
ab.setCityGmlBuilding(gmlAb);
ab.unsetGmlGeometries();
Mockito.verify(biMock).unsetGmlGeometries();
Mockito.verify(bsMock).unsetGmlGeometries();
ab.clearGmlGeometries();
assertNull(gmlAb.getLod1Solid());
assertNull(gmlAb.getLod2Solid());
assertNull(gmlAb.getLod3Solid());
......@@ -340,21 +293,15 @@ public class AbstractBuildingTest {
}
private AbstractBuilding createAbstractBuilding() {
AbstractBuilding ab = new AbstractBuilding() {
return new AbstractBuilding() {
private static final long serialVersionUID = -448362592456318541L;
@Override
public Copyable createCopyInstance() {
return null;
}
@Override
public CityObject getTopLevelCityObject(){
return null;
}
};
return ab;
}
}
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor;
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.parser.ParserConfiguration;
import org.citygml4j.core.model.core.AbstractSpaceBoundary;
import org.citygml4j.core.util.geometry.GeometryFactory;
import org.citygml4j.core.visitor.ObjectVisitor;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
import org.xmlobjects.gml.model.geometry.primitives.SolidProperty;
import java.util.ArrayList;
import java.util.List;
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.assertTrue;
import static org.mockito.Mockito.mock;
public class AbstractRoomTest {
AbstractRoom abRoom;
@Before
public void setUp() {
abRoom = new AbstractRoom() {
@Override
public CityObject getTopLevelCityObject() {
return null;
}
};
}
@Test
public void testAbstractRoomVisitorPropagation() {
Installation mockInstallation = Mockito.mock(Installation.class);
BoundarySurface mockBoundarySurface = Mockito.mock(BoundarySurface.class);
Geometry geometry = Mockito.mock(Geometry.class);
abRoom.addRoomInstallation(mockInstallation);
abRoom.addBoundarySurface(mockBoundarySurface);
abRoom.addGeometry(geometry);
CheckableUtilsVisitor c = new CheckableUtilsVisitor() {
};
abRoom.accept(c);
Mockito.verify(mockInstallation).accept(c);
Mockito.verify(mockBoundarySurface).accept(c);
Mockito.verify(geometry).accept(c);
}
@Test
public void testContainsError() {
assertFalse(abRoom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
assertFalse(abRoom.containsError(CheckId.C_GE_P_NON_PLANAR));
abRoom.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(abRoom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
assertFalse(abRoom.containsError(CheckId.C_GE_P_NON_PLANAR));
abRoom.addCheckResult(new CheckResult(CheckId.C_GE_P_NON_PLANAR, ResultStatus.OK, mock(CheckError.class)));
assertTrue(abRoom.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
assertFalse(abRoom.containsError(CheckId.C_GE_P_NON_PLANAR));
}
@Test
public void testClearAllContainedCheckResults() {
abRoom.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
assertEquals(1, abRoom.getAllCheckResults().size());
abRoom.clearAllContainedCheckResults();
assertTrue(abRoom.getAllCheckResults().isEmpty());
}
@Test
public void testContainsAnyError() {
assertFalse(abRoom.containsAnyError());
abRoom.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
assertFalse(abRoom.containsAnyError());
abRoom.addCheckResult(
new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(abRoom.containsAnyError());
}
@Test
public void testCollectContainedErrors() {
abRoom.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
List<CheckError> errors = new ArrayList<>();
abRoom.collectContainedErrors(errors);
assertEquals(1, errors.size());
}
@Test
public void testUnsetGmlGeometries() {
org.citygml4j.core.model.core.AbstractUnoccupiedSpace gmlAUS = new org.citygml4j.core.model.core.AbstractUnoccupiedSpace() {
@Override
public void accept(ObjectVisitor visitor) {
return;
}
@Override
public boolean isValidBoundary(Class<? extends AbstractSpaceBoundary> type) {
return false;
}
};
gmlAUS.setLod1Solid(new SolidProperty());
gmlAUS.setLod2Solid(new SolidProperty());
gmlAUS.setLod3Solid(new SolidProperty());
gmlAUS.setLod0MultiSurface(new MultiSurfaceProperty());
gmlAUS.setLod2MultiSurface(new MultiSurfaceProperty());
gmlAUS.setLod3MultiSurface(new MultiSurfaceProperty());
abRoom.cgmlRoom = gmlAUS;
abRoom.clearGmlGeometries();
assertNull(gmlAUS.getLod1Solid());
assertNull(gmlAUS.getLod2Solid());
assertNull(gmlAUS.getLod3Solid());
assertNull(gmlAUS.getLod0MultiSurface());
assertNull(gmlAUS.getLod2MultiSurface());
assertNull(gmlAUS.getLod3MultiSurface());
}
@Test
public void testReCreateGeometriesSolid() {
org.citygml4j.core.model.core.AbstractUnoccupiedSpace gmlAUS = new org.citygml4j.core.model.core.AbstractUnoccupiedSpace() {
@Override
public void accept(ObjectVisitor visitor) {
return;
}
@Override
public boolean isValidBoundary(Class<? extends AbstractSpaceBoundary> type) {
return false;
}
};
abRoom.cgmlRoom = gmlAUS;
abRoom.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1));
abRoom.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2));
abRoom.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3));
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
abRoom.reCreateGeometries(factory, config);
GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAUS.getLod1Solid().getObject());
GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAUS.getLod2Solid().getObject());
GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAUS.getLod3Solid().getObject());
}
@Test
public void testReCreateGeometriesMultiSurface() {
org.citygml4j.core.model.core.AbstractUnoccupiedSpace gmlAUS = new org.citygml4j.core.model.core.AbstractUnoccupiedSpace() {
@Override
public void accept(ObjectVisitor visitor) {
return;
}
@Override
public boolean isValidBoundary(Class<? extends AbstractSpaceBoundary> type) {
return false;
}
};
abRoom.cgmlRoom = gmlAUS;
abRoom.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
abRoom.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
abRoom.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
abRoom.reCreateGeometries(factory, config);
assertNotNull(gmlAUS.getLod0MultiSurface());
assertNotNull(gmlAUS.getLod0MultiSurface().getObject());
assertNotNull(gmlAUS.getLod2MultiSurface());
assertNotNull(gmlAUS.getLod2MultiSurface().getObject());
assertNotNull(gmlAUS.getLod3MultiSurface());
assertNotNull(gmlAUS.getLod3MultiSurface().getObject());
}
}
package de.hft.stuttgart.citydoctor2.datastructure;
import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor;
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.parser.ParserConfiguration;
import org.citygml4j.core.util.geometry.GeometryFactory;
import org.citygml4j.core.visitor.ObjectVisitor;
import org.junit.Before;
import org.junit.Test;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
import org.xmlobjects.gml.model.geometry.primitives.SolidProperty;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
public class AbstractTunnelTest {
AbstractTunnel at;
@Before
public void setUp() {
at = new AbstractTunnel() {
@Override
public CityObject getTopLevelCityObject() {
return null;
}
};
}
@Test
public void testVisitorPropagation() {
Installation mockInstallation = mock(Installation.class);
TunnelHollow mockTunnelHollow = mock(TunnelHollow.class);
TunnelFurniture mockTunnelFurniture = mock(TunnelFurniture.class);
TunnelPart mockTunnelPart = mock(TunnelPart.class);
TunnelConstructiveElement mockTunnelConstructiveElement = mock(TunnelConstructiveElement.class);
BoundarySurface mockBoundarySurface = mock(BoundarySurface.class);
Geometry mockGeometry = mock(Geometry.class);
at.addTunnelInstallation(mockInstallation);
at.addTunnelHollow(mockTunnelHollow);
at.addTunnelFurniture(mockTunnelFurniture);
at.addTunnelPart(mockTunnelPart);
at.addTunnelConstructiveElement(mockTunnelConstructiveElement);
at.addBoundarySurface(mockBoundarySurface);
at.addGeometry(mockGeometry);
CheckableUtilsVisitor c = new CheckableUtilsVisitor() {
};
at.accept(c);
verify(mockInstallation).accept(c);
verify(mockTunnelHollow).accept(c);
verify(mockTunnelFurniture).accept(c);
verify(mockTunnelPart).accept(c);
verify(mockTunnelConstructiveElement).accept(c);
verify(mockBoundarySurface).accept(c);
verify(mockGeometry).accept(c);
}
@Test
public void testContainsError() {
assertFalse(at.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
assertFalse(at.containsError(CheckId.C_GE_P_NON_PLANAR));
at.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(at.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
assertFalse(at.containsError(CheckId.C_GE_P_NON_PLANAR));
at.addCheckResult(new CheckResult(CheckId.C_GE_P_NON_PLANAR, ResultStatus.OK, mock(CheckError.class)));
assertTrue(at.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
assertFalse(at.containsError(CheckId.C_GE_P_NON_PLANAR));
}
@Test
public void testClearAllContainedCheckResults() {
at.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
assertEquals(1, at.getAllCheckResults().size());
at.clearAllContainedCheckResults();
assertTrue(at.getAllCheckResults().isEmpty());
}
@Test
public void testContainsAnyError() {
assertFalse(at.containsAnyError());
at.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
assertFalse(at.containsAnyError());
at.addCheckResult(
new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(at.containsAnyError());
}
@Test
public void testCollectContainedErrors() {
at.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
List<CheckError> errors = new ArrayList<>();
at.collectContainedErrors(errors);
assertEquals(1, errors.size());
}
@Test
public void testUnsetGeometries() {
org.citygml4j.core.model.tunnel.AbstractTunnel gmlAt = new org.citygml4j.core.model.tunnel.AbstractTunnel() {
@Override
public void accept(ObjectVisitor visitor) {
}
};
at.setGmlObject(gmlAt);
gmlAt.setLod0MultiSurface(new MultiSurfaceProperty());
gmlAt.getDeprecatedProperties().setLod1MultiSurface(new MultiSurfaceProperty());
gmlAt.setLod2MultiSurface(new MultiSurfaceProperty());
gmlAt.setLod3MultiSurface(new MultiSurfaceProperty());
gmlAt.getDeprecatedProperties().setLod4MultiSurface(new MultiSurfaceProperty());
gmlAt.setLod1Solid(new SolidProperty());
gmlAt.setLod2Solid(new SolidProperty());
gmlAt.setLod3Solid(new SolidProperty());
gmlAt.getDeprecatedProperties().setLod4Solid(new SolidProperty());
at.clearGmlGeometries();
assertNull(gmlAt.getLod0MultiSurface());
assertNull(gmlAt.getDeprecatedProperties().getLod1MultiSurface());
assertNull(gmlAt.getLod2MultiSurface());
assertNull(gmlAt.getLod3MultiSurface());
assertNull(gmlAt.getDeprecatedProperties().getLod4MultiSurface());
assertNull(gmlAt.getLod1Solid());
assertNull(gmlAt.getLod2Solid());
assertNull(gmlAt.getLod3Solid());
assertNull(gmlAt.getDeprecatedProperties().getLod4Solid());
}
@Test
public void testReCreateGeometriesSolid() {
org.citygml4j.core.model.tunnel.AbstractTunnel gmlAt = new org.citygml4j.core.model.tunnel.AbstractTunnel() {
@Override
public void accept(ObjectVisitor visitor) {
}
};
at.setGmlObject(gmlAt);
at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1));
at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2));
at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3));
at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD4));
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
at.reCreateGeometries(factory, config);
GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAt.getLod1Solid().getObject());
GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAt.getLod2Solid().getObject());
GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAt.getLod3Solid().getObject());
GeometryTestUtils.assertSolidMatchesExpectedValues(gmlAt.getDeprecatedProperties().getLod4Solid().getObject());
}
@Test
public void testReCreateGeometriesMultiSurface() {
org.citygml4j.core.model.tunnel.AbstractTunnel gmlAt = new org.citygml4j.core.model.tunnel.AbstractTunnel() {
@Override
public void accept(ObjectVisitor visitor) {
}
};
at.setGmlObject(gmlAt);
at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
at.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
at.reCreateGeometries(factory, config);
assertNotNull(gmlAt.getLod0MultiSurface());
assertNotNull(gmlAt.getLod0MultiSurface().getObject());
assertNotNull(gmlAt.getDeprecatedProperties().getLod1MultiSurface());
assertNotNull(gmlAt.getDeprecatedProperties().getLod1MultiSurface().getObject());
assertNotNull(gmlAt.getLod2MultiSurface());
assertNotNull(gmlAt.getLod2MultiSurface().getObject());
assertNotNull(gmlAt.getLod3MultiSurface());
assertNotNull(gmlAt.getLod3MultiSurface().getObject());
assertNotNull(gmlAt.getDeprecatedProperties().getLod4MultiSurface());
assertNotNull(gmlAt.getDeprecatedProperties().getLod4MultiSurface().getObject());
}
}
\ No newline at end of file
......@@ -23,11 +23,16 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import de.hft.stuttgart.citydoctor2.utils.visitors.ClearVisitorResultsVisitor;
import de.hft.stuttgart.citydoctor2.utils.visitors.GmlGeometryRebuilder;
import de.hft.stuttgart.citydoctor2.utils.visitors.UnsetGeometriesVisitor;
import org.citygml4j.core.model.construction.AbstractConstructionSurface;
import org.citygml4j.core.model.construction.WallSurface;
import org.citygml4j.core.model.core.AbstractThematicSurface;
......@@ -36,7 +41,7 @@ import org.junit.Test;
import org.mockito.Mockito;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
......@@ -45,13 +50,28 @@ import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
public class BoundarySurfaceTest {
//Todo: Check this class for rework potential with the new Visitors
@Test
public void testVisitorPropagation() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
Opening oMock = Mockito.mock(Opening.class);
bs.addOpening(oMock);
CheckableUtilsVisitor c = new CheckableUtilsVisitor() {
};
bs.accept(c);
verify(oMock).accept(c);
}
@Test
public void testAccept() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
Opening oMock = Mockito.mock(Opening.class);
bs.addOpening(oMock);
AtomicInteger bsCounter = new AtomicInteger(0);
AbstractCheck c = new AbstractCheck() {
CheckableUtilsVisitor c = new CheckableUtilsVisitor() {
@Override
public void check(BoundarySurface bs) {
......@@ -59,7 +79,7 @@ public class BoundarySurfaceTest {
}
};
bs.accept(c);
Mockito.verify(oMock).accept(c);
verify(oMock).accept(c);
assertEquals(1, bsCounter.intValue());
}
......@@ -69,7 +89,7 @@ public class BoundarySurfaceTest {
Opening oMock = Mockito.mock(Opening.class);
bs.addOpening(oMock);
AtomicInteger bsCounter = new AtomicInteger(0);
AbstractCheck c = new AbstractCheck() {
CheckableUtilsVisitor c = new CheckableUtilsVisitor() {
@Override
public void check(BridgeObject bo) {
......@@ -77,26 +97,18 @@ public class BoundarySurfaceTest {
}
};
bs.accept(c);
Mockito.verify(oMock).accept(c);
verify(oMock).accept(c);
assertEquals(0, bsCounter.intValue());
}
@Test
public void testPrepareForChecking() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
Opening oMock = Mockito.mock(Opening.class);
bs.addOpening(oMock);
Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, Lod.LOD2);
Geometry spyGeom = Mockito.spy(geom);
bs.addGeometry(spyGeom);
bs.prepareForChecking();
Mockito.verify(oMock).prepareForChecking();
}
@Test
public void testClearMetaInformation() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
Opening oMock = Mockito.mock(Opening.class);
bs.addOpening(oMock);
bs.clearMetaInformation();
Mockito.verify(oMock).clearMetaInformation();
verify(spyGeom).updateEdgesAndVertices();
}
@Test
......@@ -130,43 +142,29 @@ public class BoundarySurfaceTest {
assertFalse(bs.getAllCheckResults().isEmpty());
bs.addOpening(oMock);
bs.clearAllContainedCheckResults();
Mockito.verify(oMock).clearAllContainedCheckResults();
verify(oMock).accept(any(ClearVisitorResultsVisitor.class));
assertTrue(bs.getAllCheckResults().isEmpty());
}
@Test
public void testContainsAnyError() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
Opening oMock = Mockito.mock(Opening.class);
bs.addOpening(oMock);
assertFalse(bs.containsAnyError());
Mockito.verify(oMock).containsAnyError();
bs.addCheckResult(
new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, Mockito.mock(CheckError.class)));
assertTrue(bs.containsAnyError());
}
@Test
public void testContainsAnyErrorInOpeing() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
Opening oMock = Mockito.mock(Opening.class);
bs.addOpening(oMock);
Mockito.when(oMock.containsAnyError()).thenReturn(true);
assertTrue(bs.containsAnyError());
}
@Test
public void testCollectContainedErrors() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
Opening oMock = Mockito.mock(Opening.class);
bs.addCheckResult(
new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, Mockito.mock(CheckError.class)));
bs.addOpening(oMock);
List<CheckError> errors = new ArrayList<>();
bs.collectContainedErrors(errors);
assertEquals(1, errors.size());
Mockito.verify(oMock).collectContainedErrors(errors);
;
}
@Test
......@@ -320,7 +318,7 @@ public class BoundarySurfaceTest {
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
bs.reCreateGeometries(factory, config);
Mockito.verify(oMock).reCreateGeometries(factory, config);
verify(oMock).accept(any(GmlGeometryRebuilder.class));
}
@Test
......@@ -342,8 +340,8 @@ public class BoundarySurfaceTest {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, ws);
Opening oMock = Mockito.mock(Opening.class);
bs.addOpening(oMock);
bs.unsetGmlGeometries();
Mockito.verify(oMock).unsetGmlGeometries();
bs.accept(new UnsetGeometriesVisitor());
verify(oMock).accept(any(UnsetGeometriesVisitor.class));
assertNull(ws.getLod2MultiSurface());
assertNull(ws.getLod3MultiSurface());
assertNull(ws.getDeprecatedProperties().getLod4MultiSurface());
......
......@@ -22,36 +22,43 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
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 java.util.concurrent.atomic.AtomicInteger;
import de.hft.stuttgart.citydoctor2.utils.visitors.UnsetGeometriesVisitor;
import org.citygml4j.core.model.bridge.AbstractBridge;
import org.citygml4j.core.model.bridge.Bridge;
import org.citygml4j.core.model.deprecated.bridge.DeprecatedPropertiesOfAbstractBridge;
import org.citygml4j.core.util.geometry.GeometryFactory;
import org.citygml4j.core.visitor.ObjectVisitor;
import org.junit.Test;
import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor;
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.BridgeObject.BridgeType;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import org.mockito.Mockito;
public class BridgeObjectTest {
//TODO: Rework this class with the new Visitors
@Test
public void testAccept() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
bo.addBoundarySurface(new BoundarySurface(null));
AtomicInteger boCounter = new AtomicInteger(0);
AtomicInteger bsCounter = new AtomicInteger(0);
AbstractCheck c = new AbstractCheck() {
CheckableUtilsVisitor c = new CheckableUtilsVisitor() {
@Override
public void check(BridgeObject bo) {
......@@ -68,206 +75,156 @@ public class BridgeObjectTest {
assertEquals(1, bsCounter.intValue());
AtomicInteger boCounter2 = new AtomicInteger(0);
c = new AbstractCheck();
c = new CheckableUtilsVisitor() {
};
bo.accept(c);
assertEquals(0, boCounter2.intValue());
}
@Test
public void testPrepareForChecking() {
public void testVisitorPropagation() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
BridgeObject partMock = mock(BridgeObject.class);
BridgeRoom mockRoom = mock(BridgeRoom.class);
BridgeRoomFurniture mockFurn = mock(BridgeRoomFurniture.class);
BridgeConstructiveElement ceMock = mock(BridgeConstructiveElement.class);
Installation instMock = mock(Installation.class);
BoundarySurface bsMock = mock(BoundarySurface.class);
Geometry geomMock = mock(Geometry.class);
bo.addBridgePart(partMock);
bo.addBridgeRoom(mockRoom);
bo.addBridgeFurniture(mockFurn);
bo.addConstructiveElement(ceMock);
bo.addBridgeInstallation(instMock);
bo.addBoundarySurface(bsMock);
bo.prepareForChecking();
verify(bsMock).prepareForChecking();
bo.addGeometry(geomMock);
CheckableUtilsVisitor c = new CheckableUtilsVisitor() {
};
bo.accept(c);
verify(partMock).accept(c);
verify(mockRoom).accept(c);
verify(mockFurn).accept(c);
verify(ceMock).accept(c);
verify(instMock).accept(c);
verify(bsMock).accept(c);
verify(geomMock).accept(c);
}
@Test
public void testClearMetaInformation() {
public void testPrepareForChecking() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
BoundarySurface bsMock = mock(BoundarySurface.class);
bo.addBoundarySurface(bsMock);
bo.clearMetaInformation();
verify(bsMock).clearMetaInformation();
Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, Lod.LOD2);
Geometry spyGeom = Mockito.spy(geom);
bo.addGeometry(spyGeom);
bo.prepareForChecking();
verify(spyGeom).updateEdgesAndVertices();
}
@Test
public void testContainsError() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
assertFalse(bo.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
assertFalse(bo.containsError(CheckId.C_GE_P_NON_PLANAR));
bo.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(bo.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
}
@Test
public void testContainsError2() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
BoundarySurface bsMock = mock(BoundarySurface.class);
bo.addBoundarySurface(bsMock);
assertFalse(bo.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
when(bsMock.containsError(CheckId.C_GE_P_HOLE_OUTSIDE)).thenReturn(true);
assertFalse(bo.containsError(CheckId.C_GE_P_NON_PLANAR));
bo.addCheckResult(new CheckResult(CheckId.C_GE_P_NON_PLANAR, ResultStatus.OK, mock(CheckError.class)));
assertTrue(bo.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
assertFalse(bo.containsError(CheckId.C_GE_P_NON_PLANAR));
}
@Test
public void testClearAllContainedCheckResults() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
BoundarySurface bsMock = mock(BoundarySurface.class);
bo.addBoundarySurface(bsMock);
bo.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
assertEquals(1, bo.getAllCheckResults().size());
bo.clearAllContainedCheckResults();
verify(bsMock).clearAllContainedCheckResults();
assertTrue(bo.getAllCheckResults().isEmpty());
}
@Test
public void testContainsAnyError() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
BoundarySurface bsMock = mock(BoundarySurface.class);
bo.addBoundarySurface(bsMock);
bo.containsAnyError();
verify(bsMock).containsAnyError();
when(bsMock.containsAnyError()).thenReturn(true);
assertFalse(bo.containsAnyError());
bo.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
assertFalse(bo.containsAnyError());
bo.addCheckResult(
new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(bo.containsAnyError());
BridgeObject bo2 = new BridgeObject(mock(AbstractBridge.class));
bo2.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
assertTrue(bo2.containsAnyError());
}
@Test
public void testCollectContainedErrors() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
BoundarySurface bsMock = mock(BoundarySurface.class);
bo.addBoundarySurface(bsMock);
ArrayList<CheckError> errors = new ArrayList<>();
bo.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
List<CheckError> errors = new ArrayList<>();
bo.collectContainedErrors(errors);
verify(bsMock).collectContainedErrors(errors);
assertEquals(1, errors.size());
}
@Test
public void testReCreateGeometries() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
BoundarySurface bsMock = mock(BoundarySurface.class);
bo.addBoundarySurface(bsMock);
GeometryFactory factoryMock = mock(GeometryFactory.class);
ParserConfiguration configMock = mock(ParserConfiguration.class);
bo.reCreateGeometries(factoryMock, configMock);
verify(bsMock).reCreateGeometries(factoryMock, configMock);
}
@Test
public void testReCreateGeometriesMultiSurfaceLod1() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1);
AbstractBridge ab = new Bridge();
bo.setGmlObject(ab);
bo.addGeometry(geom);
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
bo.reCreateGeometries(factory, config);
assertNotNull(ab.getDeprecatedProperties().getLod1MultiSurface());
assertNotNull(ab.getDeprecatedProperties().getLod1MultiSurface().getObject());
public void testReCreateGeometriesSolid() {
org.citygml4j.core.model.bridge.AbstractBridge gmlBr = new AbstractBridge() {
@Override
public void accept(ObjectVisitor visitor) {
}
};
BridgeObject bo = new BridgeObject(gmlBr);
bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1));
bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2));
bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3));
bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD4));
}
@Test
public void testReCreateGeometriesMultiSurfaceLod2() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2);
AbstractBridge ab = new Bridge();
bo.setGmlObject(ab);
bo.addGeometry(geom);
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
bo.reCreateGeometries(factory, config);
assertNotNull(ab.getLod2MultiSurface());
assertNotNull(ab.getLod2MultiSurface().getObject());
}
@Test
public void testReCreateGeometriesMultiSurfaceLod3() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3);
AbstractBridge ab = new Bridge();
bo.setGmlObject(ab);
bo.addGeometry(geom);
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
bo.reCreateGeometries(factory, config);
assertNotNull(ab.getLod3MultiSurface());
assertNotNull(ab.getLod3MultiSurface().getObject());
}
@Test
public void testReCreateGeometriesMultiSurfaceLod4() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4);
AbstractBridge ab = new Bridge();
bo.setGmlObject(ab);
bo.addGeometry(geom);
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
bo.reCreateGeometries(factory, config);
assertNotNull(ab.getDeprecatedProperties().getLod4MultiSurface());
assertNotNull(ab.getDeprecatedProperties().getLod4MultiSurface().getObject());
}
@Test
public void testReCreateGeometriesSolidLod1() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD1);
AbstractBridge ab = new Bridge();
bo.setGmlObject(ab);
bo.addGeometry(geom);
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
bo.reCreateGeometries(factory, config);
assertNotNull(ab.getLod1Solid());
assertNotNull(ab.getLod1Solid().getObject());
}
@Test
public void testReCreateGeometriesSolidLod2() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD2);
AbstractBridge ab = new Bridge();
bo.setGmlObject(ab);
bo.addGeometry(geom);
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
bo.reCreateGeometries(factory, config);
assertNotNull(ab.getLod2Solid());
assertNotNull(ab.getLod2Solid().getObject());
}
@Test
public void testReCreateGeometriesSolidLod3() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD3);
AbstractBridge ab = new Bridge();
bo.setGmlObject(ab);
bo.addGeometry(geom);
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
bo.reCreateGeometries(factory, config);
assertNotNull(ab.getLod3Solid());
assertNotNull(ab.getLod3Solid().getObject());
GeometryTestUtils.assertSolidMatchesExpectedValues(gmlBr.getLod1Solid().getObject());
GeometryTestUtils.assertSolidMatchesExpectedValues(gmlBr.getLod2Solid().getObject());
GeometryTestUtils.assertSolidMatchesExpectedValues(gmlBr.getLod3Solid().getObject());
GeometryTestUtils.assertSolidMatchesExpectedValues(gmlBr.getDeprecatedProperties().getLod4Solid().getObject());
}
@Test
public void testReCreateGeometriesSolidLod4() {
BridgeObject bo = new BridgeObject(mock(AbstractBridge.class));
Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD4);
AbstractBridge ab = new Bridge();
bo.setGmlObject(ab);
bo.addGeometry(geom);
public void testReCreateGeometriesMultiSurface() {
org.citygml4j.core.model.bridge.AbstractBridge gmlBr = new AbstractBridge() {
@Override
public void accept(ObjectVisitor visitor) {
}
};
BridgeObject bo = new BridgeObject(gmlBr);
bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD2));
bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
bo.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
GeometryFactory factory = GeometryFactory.newInstance();
ParserConfiguration config = new ParserConfiguration(8, false);
bo.reCreateGeometries(factory, config);
assertNotNull(ab.getDeprecatedProperties().getLod4Solid());
assertNotNull(ab.getDeprecatedProperties().getLod4Solid().getObject());
assertNotNull(gmlBr.getLod0MultiSurface());
assertNotNull(gmlBr.getLod0MultiSurface().getObject());
assertNotNull(gmlBr.getDeprecatedProperties().getLod1MultiSurface());
assertNotNull(gmlBr.getDeprecatedProperties().getLod1MultiSurface().getObject());
assertNotNull(gmlBr.getLod2MultiSurface());
assertNotNull(gmlBr.getLod2MultiSurface().getObject());
assertNotNull(gmlBr.getLod3MultiSurface());
assertNotNull(gmlBr.getLod3MultiSurface().getObject());
assertNotNull(gmlBr.getDeprecatedProperties().getLod4MultiSurface());
assertNotNull(gmlBr.getDeprecatedProperties().getLod4MultiSurface().getObject());
}
@Test
public void testUnsetGmlGeometries() {
AbstractBridge abMock = mock(AbstractBridge.class);
......@@ -276,8 +233,13 @@ public class BridgeObjectTest {
BridgeObject bo = new BridgeObject(abMock);
BoundarySurface bsMock = mock(BoundarySurface.class);
bo.addBoundarySurface(bsMock);
bo.unsetGmlGeometries();
doAnswer(invocation -> {
bsMock.unsetGmlGeometries();
return null;
}).when(bsMock).accept(any(UnsetGeometriesVisitor.class));
bo.accept(new UnsetGeometriesVisitor());
verify(bsMock).accept(any(UnsetGeometriesVisitor.class));
verify(bsMock).unsetGmlGeometries();
verify(propsMock).setLod1MultiSurface(null);
verify(abMock).setLod2MultiSurface(null);
......
......@@ -22,9 +22,14 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor;
import org.citygml4j.core.model.construction.RoofSurface;
import org.junit.Test;
import org.mockito.Mockito;
import org.xmlobjects.gml.model.basictypes.Code;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing.LinearRingType;
......@@ -120,4 +125,42 @@ public class BuildingTest {
return b;
}
@Test
public void testVisitorPropagation() {
Building b = new Building();
BuildingPart bp = new BuildingPart(b);
BuildingPart spyBp = Mockito.spy(bp);
b.getBuildingParts().remove(bp);
b.addBuildingPart(spyBp);
BuildingRoom mockRoom = mock(BuildingRoom.class);
Installation mockInstallation = mock(Installation.class);
BuildingRoomFurniture mockBuildingRoomFurniture = mock(BuildingRoomFurniture.class);
BuildingUnit mockBuildingUnit = mock(BuildingUnit.class);
Storey mockStorey = mock(Storey.class);
b.addBuildingRoom(mockRoom);
b.addBuildingInstallation(mockInstallation);
b.addBuildingRoomFurniture(mockBuildingRoomFurniture);
b.addBuildingUnit(mockBuildingUnit);
b.addStorey(mockStorey);
bp.addBuildingRoom(mockRoom);
bp.addBuildingInstallation(mockInstallation);
bp.addBuildingRoomFurniture(mockBuildingRoomFurniture);
bp.addBuildingUnit(mockBuildingUnit);
bp.addStorey(mockStorey);
CheckableUtilsVisitor c = new CheckableUtilsVisitor() {
};
b.accept(c);
verify(spyBp).accept(c);
verify(mockRoom, times(2)).accept(c);
verify(mockInstallation, times(2)).accept(c);
verify(mockBuildingRoomFurniture, times(2)).accept(c);
verify(mockBuildingUnit, times(2)).accept(c);
verify(mockStorey, times(2)).accept(c);
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment