AbstractBuildingTest.java 13.9 KB
Newer Older
Matthias Betz's avatar
Matthias Betz committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*-
 *  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.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.assertTrue;
26
import static org.mockito.Mockito.mock;
Matthias Betz's avatar
Matthias Betz committed
27
28
29
30
31

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

Matthias Betz's avatar
Matthias Betz committed
32
33
34
import org.citygml4j.core.model.construction.WallSurface;
import org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty;
import org.citygml4j.core.util.geometry.GeometryFactory;
Matthias Betz's avatar
Matthias Betz committed
35
36
import org.junit.Test;
import org.mockito.Mockito;
Matthias Betz's avatar
Matthias Betz committed
37
38
39
40
41
42
43
44
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;
Matthias Betz's avatar
Matthias Betz committed
45

Matthias Betz's avatar
Matthias Betz committed
46
import de.hft.stuttgart.citydoctor2.check.AbstractCheck;
Matthias Betz's avatar
Matthias Betz committed
47
48
49
50
51
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;
Matthias Betz's avatar
Matthias Betz committed
52
import de.hft.stuttgart.citydoctor2.utils.Copyable;
Matthias Betz's avatar
Matthias Betz committed
53
54
55
56
57

public class AbstractBuildingTest {

	@Test
	public void testAccept() {
Matthias Betz's avatar
Matthias Betz committed
58
		AbstractBuilding ab = createAbstractBuilding();
Matthias Betz's avatar
Matthias Betz committed
59
60
61
62
63
64
		ab.addBoundarySurface(new BoundarySurface(null));
		ab.addBuildingInstallation(new BuildingInstallation());
		ab.addBuildingInstallation(new BuildingInstallation());
		AtomicInteger abCounter = new AtomicInteger(0);
		AtomicInteger bsCounter = new AtomicInteger(0);
		AtomicInteger biCounter = new AtomicInteger(0);
65
		AbstractCheck c = new AbstractCheck() {
Matthias Betz's avatar
Matthias Betz committed
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81

			@Override
			public void check(AbstractBuilding ab) {
				abCounter.incrementAndGet();
			}

			@Override
			public void check(BoundarySurface bs) {
				bsCounter.incrementAndGet();
			}
		};
		ab.accept(c);
		assertEquals(1, abCounter.intValue());
		assertEquals(1, bsCounter.intValue());
		assertEquals(0, biCounter.intValue());

82
		AbstractCheck c2 = new AbstractCheck() {
Matthias Betz's avatar
Matthias Betz committed
83
84
85
86
87
88
89
90
91
92
93
94

			@Override
			public void check(BuildingInstallation bi) {
				biCounter.incrementAndGet();
			}
		};
		ab.accept(c2);
		assertEquals(2, biCounter.intValue());
	}

	@Test
	public void testPrepareForChecking() {
95
96
		BuildingInstallation biMock = mock(BuildingInstallation.class);
		BoundarySurface bsMock = mock(BoundarySurface.class);
Matthias Betz's avatar
Matthias Betz committed
97

Matthias Betz's avatar
Matthias Betz committed
98
		AbstractBuilding ab = createAbstractBuilding();
Matthias Betz's avatar
Matthias Betz committed
99
100
101
102
103
104
105
106
107
		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() {
108
109
		BuildingInstallation biMock = mock(BuildingInstallation.class);
		BoundarySurface bsMock = mock(BoundarySurface.class);
Matthias Betz's avatar
Matthias Betz committed
110

Matthias Betz's avatar
Matthias Betz committed
111
		AbstractBuilding ab = createAbstractBuilding();
Matthias Betz's avatar
Matthias Betz committed
112
113
114
115
116
117
118
119
120
		ab.addBoundarySurface(bsMock);
		ab.addBuildingInstallation(biMock);
		ab.clearMetaInformation();
		Mockito.verify(biMock, Mockito.times(1)).clearMetaInformation();
		Mockito.verify(bsMock, Mockito.times(1)).clearMetaInformation();
	}

	@Test
	public void testContainsError() {
Matthias Betz's avatar
Matthias Betz committed
121
		AbstractBuilding ab = createAbstractBuilding();
Matthias Betz's avatar
Matthias Betz committed
122
		assertFalse(ab.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
123
		ab.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
Matthias Betz's avatar
Matthias Betz committed
124
125
126
127
128
		assertTrue(ab.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
	}

	@Test
	public void testContainsErrorInBs() {
Matthias Betz's avatar
Matthias Betz committed
129
		AbstractBuilding ab = createAbstractBuilding();
130
		BoundarySurface bsMock = mock(BoundarySurface.class);
Matthias Betz's avatar
Matthias Betz committed
131
132
133
134
135
136
137
138
		ab.addBoundarySurface(bsMock);
		assertFalse(ab.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
		Mockito.when(bsMock.containsError(CheckId.C_GE_P_HOLE_OUTSIDE)).thenReturn(true);
		assertTrue(ab.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
	}

	@Test
	public void testContainsErrorInBi() {
Matthias Betz's avatar
Matthias Betz committed
139
		AbstractBuilding ab = createAbstractBuilding();
140
		BuildingInstallation biMock = mock(BuildingInstallation.class);
Matthias Betz's avatar
Matthias Betz committed
141
142
143
144
145
146
147
148
		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() {
149
150
		BuildingInstallation biMock = mock(BuildingInstallation.class);
		BoundarySurface bsMock = mock(BoundarySurface.class);
Matthias Betz's avatar
Matthias Betz committed
151

Matthias Betz's avatar
Matthias Betz committed
152
		AbstractBuilding ab = createAbstractBuilding();
Matthias Betz's avatar
Matthias Betz committed
153
154
155
156
157
158
159
160
161
162
163
164
165
		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());
	}

	@Test
	public void testContainsAnyError() {
Matthias Betz's avatar
Matthias Betz committed
166
		AbstractBuilding ab = createAbstractBuilding();
Matthias Betz's avatar
Matthias Betz committed
167
168
169
170
		assertFalse(ab.containsAnyError());
		ab.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.OK, null));
		assertFalse(ab.containsAnyError());
		ab.addCheckResult(
171
				new CheckResult(CheckId.C_GE_P_INNER_RINGS_NESTED, ResultStatus.ERROR, mock(CheckError.class)));
Matthias Betz's avatar
Matthias Betz committed
172
173
174
175
176
		assertTrue(ab.containsAnyError());
	}

	@Test
	public void testContainsAnyErrorInBs() {
Matthias Betz's avatar
Matthias Betz committed
177
		AbstractBuilding ab = createAbstractBuilding();
178
		BoundarySurface bsMock = mock(BoundarySurface.class);
Matthias Betz's avatar
Matthias Betz committed
179
180
181
182
183
184
185
186
		ab.addBoundarySurface(bsMock);
		assertFalse(ab.containsAnyError());
		Mockito.when(bsMock.containsAnyError()).thenReturn(true);
		assertTrue(ab.containsAnyError());
	}

	@Test
	public void testContainsAnyErrorInBi() {
Matthias Betz's avatar
Matthias Betz committed
187
		AbstractBuilding ab = createAbstractBuilding();
188
		BuildingInstallation biMock = mock(BuildingInstallation.class);
Matthias Betz's avatar
Matthias Betz committed
189
190
191
192
193
194
195
196
		ab.addBuildingInstallation(biMock);
		assertFalse(ab.containsAnyError());
		Mockito.when(biMock.containsAnyError()).thenReturn(true);
		assertTrue(ab.containsAnyError());
	}

	@Test
	public void testCollectContainedErrors() {
197
198
		BuildingInstallation biMock = mock(BuildingInstallation.class);
		BoundarySurface bsMock = mock(BoundarySurface.class);
Matthias Betz's avatar
Matthias Betz committed
199

Matthias Betz's avatar
Matthias Betz committed
200
		AbstractBuilding ab = createAbstractBuilding();
Matthias Betz's avatar
Matthias Betz committed
201
202
		ab.addBoundarySurface(bsMock);
		ab.addBuildingInstallation(biMock);
203
		ab.addCheckResult(new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, mock(CheckError.class)));
Matthias Betz's avatar
Matthias Betz committed
204
205
206
207
208
209
210
211
212
		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() {
Matthias Betz's avatar
Matthias Betz committed
213
		Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.SOLID);
Matthias Betz's avatar
Matthias Betz committed
214

Matthias Betz's avatar
Matthias Betz committed
215
		AbstractBuilding ab = createAbstractBuilding();
Matthias Betz's avatar
Matthias Betz committed
216
		org.citygml4j.core.model.building.AbstractBuilding gmlAb = new org.citygml4j.core.model.building.Building();
Matthias Betz's avatar
Matthias Betz committed
217
218
		ab.setCityGmlBuilding(gmlAb);
		ab.addGeometry(geom);
Matthias Betz's avatar
Matthias Betz committed
219
		GeometryFactory factory = GeometryFactory.newInstance();
Matthias Betz's avatar
Matthias Betz committed
220
221
		ParserConfiguration config = new ParserConfiguration(8, false);
		ab.reCreateGeometries(factory, config);
Matthias Betz's avatar
Matthias Betz committed
222
		AbstractSolid aSolid = gmlAb.getLod2Solid().getObject();
Matthias Betz's avatar
Matthias Betz committed
223
224
		assertTrue(aSolid instanceof Solid);
		Solid solid = (Solid) aSolid;
Matthias Betz's avatar
Matthias Betz committed
225
226
		Shell geometry = solid.getExterior().getObject();
		List<SurfaceProperty> surfaceMember = geometry.getSurfaceMembers();
Matthias Betz's avatar
Matthias Betz committed
227
		assertEquals(1, surfaceMember.size());
Matthias Betz's avatar
Matthias Betz committed
228
229
230
231
232
233
		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();
234
235
		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 };
Matthias Betz's avatar
Matthias Betz committed
236
237
		for (int i = 0; i < posList.size(); i++) {
			assertEquals(expectedValues[i], posList.get(i), 0.00000001);
Matthias Betz's avatar
Matthias Betz committed
238
239
240
241
242
		}
	}

	@Test
	public void testReCreateGeometriesMultiSurface() {
Matthias Betz's avatar
Matthias Betz committed
243
		Geometry geom = GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE);
Matthias Betz's avatar
Matthias Betz committed
244

Matthias Betz's avatar
Matthias Betz committed
245
		AbstractBuilding ab = createAbstractBuilding();
Matthias Betz's avatar
Matthias Betz committed
246
		org.citygml4j.core.model.building.AbstractBuilding gmlAb = new org.citygml4j.core.model.building.Building();
Matthias Betz's avatar
Matthias Betz committed
247
248
		ab.setCityGmlBuilding(gmlAb);
		ab.addGeometry(geom);
Matthias Betz's avatar
Matthias Betz committed
249
		GeometryFactory factory = GeometryFactory.newInstance();
Matthias Betz's avatar
Matthias Betz committed
250
251
252
		ParserConfiguration config = new ParserConfiguration(8, false);
		ab.reCreateGeometries(factory, config);
		assertNotNull(gmlAb.getLod2MultiSurface());
Matthias Betz's avatar
Matthias Betz committed
253
		assertNotNull(gmlAb.getLod2MultiSurface().getObject());
Matthias Betz's avatar
Matthias Betz committed
254
255
256
257
	}

	@Test
	public void testReCreateGeometriesBs() {
258
		BoundarySurface bsMock = mock(BoundarySurface.class);
Matthias Betz's avatar
Matthias Betz committed
259
		AbstractBuilding ab = createAbstractBuilding();
Matthias Betz's avatar
Matthias Betz committed
260
		List<Geometry> geometries = new ArrayList<>();
Matthias Betz's avatar
Matthias Betz committed
261
		geometries.add(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE));
Matthias Betz's avatar
Matthias Betz committed
262
263
		Mockito.when(bsMock.getGeometries()).thenReturn(geometries);
		ab.addBoundarySurface(bsMock);
Matthias Betz's avatar
Matthias Betz committed
264
		org.citygml4j.core.model.building.AbstractBuilding gmlAb = new org.citygml4j.core.model.building.Building();
Matthias Betz's avatar
Matthias Betz committed
265
		ab.setCityGmlBuilding(gmlAb);
Matthias Betz's avatar
Matthias Betz committed
266
		GeometryFactory factory = GeometryFactory.newInstance();
Matthias Betz's avatar
Matthias Betz committed
267
268
269
270
		ParserConfiguration config = new ParserConfiguration(8, false);
		ab.reCreateGeometries(factory, config);
		Mockito.verify(bsMock).reCreateGeometries(factory, config);
	}
271

Matthias Betz's avatar
Matthias Betz committed
272
273
274
	@Test
	public void testReCreateGeometriesEmptyBs() {
		WallSurface ws = new WallSurface();
275
		BoundarySurface bsMock = mock(BoundarySurface.class);
Matthias Betz's avatar
Matthias Betz committed
276
		Mockito.when(bsMock.getGmlObject()).thenReturn(ws);
Matthias Betz's avatar
Matthias Betz committed
277
		AbstractBuilding ab = createAbstractBuilding();
Matthias Betz's avatar
Matthias Betz committed
278
		ab.addBoundarySurface(bsMock);
Matthias Betz's avatar
Matthias Betz committed
279
		GeometryFactory factory = GeometryFactory.newInstance();
Matthias Betz's avatar
Matthias Betz committed
280
		ParserConfiguration config = new ParserConfiguration(8, false);
Matthias Betz's avatar
Matthias Betz committed
281
		org.citygml4j.core.model.building.AbstractBuilding gmlAb = new org.citygml4j.core.model.building.Building();
Matthias Betz's avatar
Matthias Betz committed
282
283
		ab.setCityGmlBuilding(gmlAb);
		ab.reCreateGeometries(factory, config);
Matthias Betz's avatar
Matthias Betz committed
284
285
286
287
		gmlAb.addBoundary(new AbstractSpaceBoundaryProperty());
		gmlAb.addBoundary(new AbstractSpaceBoundaryProperty(new WallSurface()));
		gmlAb.addBoundary(new AbstractSpaceBoundaryProperty(ws));
		assertEquals(3, gmlAb.getBoundaries().size());
Matthias Betz's avatar
Matthias Betz committed
288
		ab.reCreateGeometries(factory, config);
Matthias Betz's avatar
Matthias Betz committed
289
		assertEquals(2, gmlAb.getBoundaries().size());
Matthias Betz's avatar
Matthias Betz committed
290
	}
291

Matthias Betz's avatar
Matthias Betz committed
292
293
	@Test
	public void testReCreateGeometriesEmptyBi() {
294
		BuildingInstallation biMock = mock(BuildingInstallation.class);
Matthias Betz's avatar
Matthias Betz committed
295
		AbstractBuilding ab = createAbstractBuilding();
Matthias Betz's avatar
Matthias Betz committed
296
		ab.addBuildingInstallation(biMock);
Matthias Betz's avatar
Matthias Betz committed
297
		GeometryFactory factory = GeometryFactory.newInstance();
Matthias Betz's avatar
Matthias Betz committed
298
		ParserConfiguration config = new ParserConfiguration(8, false);
Matthias Betz's avatar
Matthias Betz committed
299
		org.citygml4j.core.model.building.AbstractBuilding gmlAb = new org.citygml4j.core.model.building.Building();
Matthias Betz's avatar
Matthias Betz committed
300
301
302
303
		ab.setCityGmlBuilding(gmlAb);
		ab.reCreateGeometries(factory, config);
		Mockito.verify(biMock).reCreateGeometries(factory, config);
	}
304

Matthias Betz's avatar
Matthias Betz committed
305
306
	@Test
	public void testUnsetGmlGeometries() {
307
308
		BuildingInstallation biMock = mock(BuildingInstallation.class);
		BoundarySurface bsMock = mock(BoundarySurface.class);
Matthias Betz's avatar
Matthias Betz committed
309

Matthias Betz's avatar
Matthias Betz committed
310
		AbstractBuilding ab = createAbstractBuilding();
Matthias Betz's avatar
Matthias Betz committed
311
312
		ab.addBoundarySurface(bsMock);
		ab.addBuildingInstallation(biMock);
Matthias Betz's avatar
Matthias Betz committed
313
		org.citygml4j.core.model.building.AbstractBuilding gmlAb = new org.citygml4j.core.model.building.Building();
Matthias Betz's avatar
Matthias Betz committed
314
315
316
		gmlAb.setLod1Solid(new SolidProperty());
		gmlAb.setLod2Solid(new SolidProperty());
		gmlAb.setLod3Solid(new SolidProperty());
Matthias Betz's avatar
Matthias Betz committed
317
318
		gmlAb.getDeprecatedProperties().setLod4Solid(new SolidProperty());
		gmlAb.getDeprecatedProperties().setLod1MultiSurface(new MultiSurfaceProperty());
Matthias Betz's avatar
Matthias Betz committed
319
320
		gmlAb.setLod2MultiSurface(new MultiSurfaceProperty());
		gmlAb.setLod3MultiSurface(new MultiSurfaceProperty());
Matthias Betz's avatar
Matthias Betz committed
321
		gmlAb.getDeprecatedProperties().setLod4MultiSurface(new MultiSurfaceProperty());
Matthias Betz's avatar
Matthias Betz committed
322
323
324
325
326
327
328
		ab.setCityGmlBuilding(gmlAb);
		ab.unsetGmlGeometries();
		Mockito.verify(biMock).unsetGmlGeometries();
		Mockito.verify(bsMock).unsetGmlGeometries();
		assertNull(gmlAb.getLod1Solid());
		assertNull(gmlAb.getLod2Solid());
		assertNull(gmlAb.getLod3Solid());
Matthias Betz's avatar
Matthias Betz committed
329
330
		assertNull(gmlAb.getDeprecatedProperties().getLod4Solid());
		assertNull(gmlAb.getDeprecatedProperties().getLod1MultiSurface());
Matthias Betz's avatar
Matthias Betz committed
331
332
		assertNull(gmlAb.getLod2MultiSurface());
		assertNull(gmlAb.getLod3MultiSurface());
Matthias Betz's avatar
Matthias Betz committed
333
		assertNull(gmlAb.getDeprecatedProperties().getLod4MultiSurface());
Matthias Betz's avatar
Matthias Betz committed
334
335
336
337
	}

	@Test
	public void testGetFeatureType() {
Matthias Betz's avatar
Matthias Betz committed
338
339
340
341
342
		AbstractBuilding ab = createAbstractBuilding();
		assertEquals(FeatureType.BUILDING, ab.getFeatureType());
	}

	private AbstractBuilding createAbstractBuilding() {
Matthias Betz's avatar
Matthias Betz committed
343
344
		AbstractBuilding ab = new AbstractBuilding() {
			private static final long serialVersionUID = -448362592456318541L;
Matthias Betz's avatar
Matthias Betz committed
345
346
347
348
349
350

			@Override
			public Copyable createCopyInstance() {
				return null;
			}

Matthias Betz's avatar
Matthias Betz committed
351
		};
Matthias Betz's avatar
Matthias Betz committed
352
		return ab;
Matthias Betz's avatar
Matthias Betz committed
353
354
355
	}

}