From b743fa3b01c83775122f8fbeb0092f1e5ac40d63 Mon Sep 17 00:00:00 2001
From: Riegel <alexander.riegel@hft-stuttgart.de>
Date: Wed, 4 Dec 2024 13:56:44 +0100
Subject: [PATCH] Test: Add test for XML-validation of CityGmlArchive

---
 .../citydoctor2/ziploader/ZipTest.java        |  15 ++
 .../src/test/resources/validate.zip           | Bin 0 -> 2683 bytes
 .../test/resources/validate/valCorrect.gml    | 193 ++++++++++++++++++
 .../src/test/resources/validate/valFaulty.gml | 192 +++++++++++++++++
 4 files changed, 400 insertions(+)
 create mode 100644 CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/resources/validate.zip
 create mode 100644 CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/resources/validate/valCorrect.gml
 create mode 100644 CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/resources/validate/valFaulty.gml

diff --git a/CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/java/de/hft/stuttgart/citydoctor2/ziploader/ZipTest.java b/CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/java/de/hft/stuttgart/citydoctor2/ziploader/ZipTest.java
index ac73522..b933add 100644
--- a/CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/java/de/hft/stuttgart/citydoctor2/ziploader/ZipTest.java
+++ b/CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/java/de/hft/stuttgart/citydoctor2/ziploader/ZipTest.java
@@ -75,4 +75,19 @@ public class ZipTest {
         assertTrue(epsgs.isEmpty());
     }
 
+    @Test
+    public void testValidation(){
+        ParserConfiguration valConfig = new ParserConfiguration(8,true);
+        CityGmlArchive cgmlArch = CityGmlArchive.fromZipFile("src/test/resources/validate.zip", valConfig);
+        int faultyFiles = 0;
+        for (CityGmlZipEntry entry : cgmlArch.getEntries()) {
+            if (entry instanceof ErroneousEntry errEntry) {
+                assertTrue(entry.getFileName().matches("^valFaulty.gml$"));
+                assertEquals(ZipEntryErrorType.INVALID_CITY_GML_FILE, errEntry.getErrorType());
+                faultyFiles++;
+            }
+        }
+        assertEquals(1, faultyFiles);
+    }
+
 }
diff --git a/CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/resources/validate.zip b/CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/resources/validate.zip
new file mode 100644
index 0000000000000000000000000000000000000000..f09e946a9c7420535ab6e08669309d262c726f20
GIT binary patch
literal 2683
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
Q=K%LUaTWjo4%%P+2}KlvkpKVy

literal 0
HcmV?d00001

diff --git a/CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/resources/validate/valCorrect.gml b/CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/resources/validate/valCorrect.gml
new file mode 100644
index 0000000..4671362
--- /dev/null
+++ b/CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/resources/validate/valCorrect.gml
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="utf-8"?>
+<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd">
+
+<!--
+Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m
+Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), 
+die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert 
+
+CityGML 2.0
+
+Gebäudevolumen: 56,25 m3
+
+10.5.2017
+
+Author: V. Coors, HFT Stuttgart
+Lizenz: 
+-->
+
+	<core:cityObjectMember>
+		<bldg:Building gml:id="_Simple_BD.1">
+			<bldg:lod2Solid>
+				<gml:Solid>
+					<gml:exterior>
+						<gml:CompositeSurface>
+							<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/>
+							<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/>
+							<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/>
+							<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/>
+							<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/>
+							<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/>
+							<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/>
+						</gml:CompositeSurface>
+					</gml:exterior>
+				</gml:Solid>
+			</bldg:lod2Solid>
+			<bldg:boundedBy>
+				<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1">
+					<bldg:lod2MultiSurface>
+						<gml:MultiSurface>
+							<gml:surfaceMember>
+								<gml:Polygon gml:id="_Simple_BD.1_PG.2">
+									<gml:exterior>
+										<gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1">
+											<gml:posList srsDimension="3">
+												13.0 15.0 0.0
+												13.0 15.0 3.0
+												13.0 10.0 3.0
+												13.0 10.0 0.0
+												13.0 15.0 0.0
+											</gml:posList>
+										</gml:LinearRing>
+									</gml:exterior>
+								</gml:Polygon>
+							</gml:surfaceMember>
+						</gml:MultiSurface>
+					</bldg:lod2MultiSurface>
+				</bldg:WallSurface>
+			</bldg:boundedBy>
+			<bldg:boundedBy>
+				<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2">
+					<bldg:lod2MultiSurface>
+						<gml:MultiSurface>
+							<gml:surfaceMember>
+								<gml:Polygon gml:id="_Simple_BD.1_PG.3">
+									<gml:exterior>
+										<gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1">
+											<gml:posList srsDimension="3">
+												10.0 15.0 0.0
+												10.0 15.0 3.0
+												11.5 15.0 4.5
+												13.0 15.0 3.0
+												13.0 15.0 0.0
+												10.0 15.0 0.0
+											</gml:posList>
+										</gml:LinearRing>
+									</gml:exterior>
+								</gml:Polygon>
+							</gml:surfaceMember>
+						</gml:MultiSurface>
+					</bldg:lod2MultiSurface>
+				</bldg:WallSurface>
+			</bldg:boundedBy>
+			<bldg:boundedBy>
+				<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3">
+					<bldg:lod2MultiSurface>
+						<gml:MultiSurface>
+							<gml:surfaceMember>
+								<gml:Polygon gml:id="_Simple_BD.1_PG.4">
+									<gml:exterior>
+										<gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1">
+											<gml:posList srsDimension="3">
+												10.0 10.0 3.0
+												10.0 15.0 3.0
+												10.0 15.0 0.0
+												10.0 10.0 0.0
+												10.0 10.0 3.0
+											</gml:posList>
+										</gml:LinearRing>
+									</gml:exterior>
+								</gml:Polygon>
+							</gml:surfaceMember>
+						</gml:MultiSurface>
+					</bldg:lod2MultiSurface>
+				</bldg:WallSurface>
+			</bldg:boundedBy>
+			<bldg:boundedBy>
+				<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4">
+					<bldg:lod2MultiSurface>
+						<gml:MultiSurface>
+							<gml:surfaceMember>
+								<gml:Polygon gml:id="_Simple_BD.1_PG.5">
+									<gml:exterior>
+										<gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1">
+											<gml:posList srsDimension="3">
+												13.0 10.0 0.0
+												13.0 10.0 3.0
+												11.5 10.0 4.5
+												10.0 10.0 3.0
+												10.0 10.0 0.0
+												13.0 10.0 0.0
+											</gml:posList>
+										</gml:LinearRing>
+									</gml:exterior>
+								</gml:Polygon>
+							</gml:surfaceMember>
+						</gml:MultiSurface>
+					</bldg:lod2MultiSurface>
+				</bldg:WallSurface>
+			</bldg:boundedBy>
+			<bldg:boundedBy>
+				<bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1">
+					<bldg:lod2MultiSurface>
+						<gml:MultiSurface>
+							<gml:surfaceMember>
+								<gml:Polygon gml:id="_Simple_BD.1_PG.6">
+									<gml:exterior>
+										<gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1">
+											<gml:posList srsDimension="3">
+												10.0 10.0 3.0
+												11.5 10.0 4.5
+												11.5 15.0 4.5
+												10.0 15.0 3.0
+												10.0 10.0 3.0
+											</gml:posList>
+										</gml:LinearRing>
+									</gml:exterior>
+								</gml:Polygon>
+							</gml:surfaceMember>
+							<gml:surfaceMember>
+								<gml:Polygon gml:id="_Simple_BD.1_PG.7">
+									<gml:exterior>
+										<gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1">
+											<gml:posList srsDimension="3">
+												11.5 10.0 4.5
+												13.0 10.0 3.0
+												13.0 15.0 3.0
+												11.5 15.0 4.5
+												11.5 10.0 4.5
+											</gml:posList>
+										</gml:LinearRing>
+									</gml:exterior>
+								</gml:Polygon>
+							</gml:surfaceMember>
+						</gml:MultiSurface>
+					</bldg:lod2MultiSurface>
+				</bldg:RoofSurface>
+			</bldg:boundedBy>
+			<bldg:boundedBy>
+				<bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1">
+					<bldg:lod2MultiSurface>
+						<gml:MultiSurface>
+							<gml:surfaceMember>
+								<gml:Polygon gml:id="_Simple_BD.1_PG.1">
+									<gml:exterior>
+										<gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1">
+											<gml:posList srsDimension="3">
+												10.0 10.0 0.0
+												10.0 15.0 0.0
+												13.0 15.0 0.0
+												13.0 10.0 0.0
+												10.0 10.0 0.0
+											</gml:posList>
+										</gml:LinearRing>
+									</gml:exterior>
+								</gml:Polygon>
+							</gml:surfaceMember>
+						</gml:MultiSurface>
+					</bldg:lod2MultiSurface>
+				</bldg:GroundSurface>
+			</bldg:boundedBy>
+		</bldg:Building>
+	</core:cityObjectMember>
+</core:CityModel>
\ No newline at end of file
diff --git a/CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/resources/validate/valFaulty.gml b/CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/resources/validate/valFaulty.gml
new file mode 100644
index 0000000..c0f068e
--- /dev/null
+++ b/CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/resources/validate/valFaulty.gml
@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="utf-8"?>
+<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd">
+
+<!--
+Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m
+Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), 
+die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert 
+
+CityGML 2.0
+
+Gebäudevolumen: 56,25 m3
+
+10.5.2017
+
+Author: V. Coors, HFT Stuttgart
+Lizenz: 
+-->
+
+	<core:cityObjectMember>
+		<bldg:Building gml:id="_Simple_BD.1">
+			<bldg:lod2Solid>
+				<gml:Solid>
+					<gml:exterior>
+						<gml:CompositeSurface>
+							<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/>
+							<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/>
+							<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/>
+							<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/>
+							<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/>
+							<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/>
+							<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/>
+						</gml:CompositeSurface>
+					</gml:exterior>
+				</gml:Solid>
+			</bldg:lod2Solid>
+			<bldg:boundedBy>
+				<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1">
+					<bldg:lod2MultiSurface>
+						<gml:MultiSurface>
+							<gml:surfaceMember>
+								<gml:Polygon gml:id="_Simple_BD.1_PG.2">
+									<gml:exterior>
+										<gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1">
+											<gml:posList srsDimension="3">
+												13.0 15.0 0.0
+												13.0 15.0 3.0
+												13.0 10.0 3.0
+												13.0 10.0 0.0
+												13.0 15.0 0.0
+											</gml:posList>
+										</gml:LinearRing>
+									</gml:exterior>
+								</gml:Polygon>
+							</gml:surfaceMember>
+						</gml:MultiSurface>
+					</bldg:lod2MultiSurface>
+				</bldg:WallSurface>
+			</bldg:boundedBy>
+			<bldg:boundedBy>
+				<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2">
+					<bldg:lod2MultiSurface>
+						<gml:MultiSurface>
+							<gml:surfaceMember>
+								<gml:Polygon gml:id="_Simple_BD.1_PG.3">
+									<gml:exterior>
+										<gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1">
+											<gml:posList srsDimension="3">
+												10.0 15.0 0.0
+												10.0 15.0 3.0
+												11.5 15.0 4.5
+												13.0 15.0 3.0
+												13.0 15.0 0.0
+												10.0 15.0 0.0
+											</gml:posList>
+										</gml:LinearRing>
+									</gml:exterior>
+								</gml:Polygon>
+							</gml:surfaceMember>
+						</gml:MultiSurface>
+					</bldg:lod2MultiSurface>
+				</bldg:WallSurface>
+			</bldg:boundedBy>
+			<bldg:boundedBy>
+				<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3">
+					<bldg:lod2MultiSurface>
+						<gml:MultiSurface>
+							<gml:surfaceMember>
+								<gml:Polygon gml:id="_Simple_BD.1_PG.4">
+									<gml:exterior>
+										<gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1">
+											<gml:posList srsDimension="3">
+												10.0 10.0 3.0
+												10.0 15.0 3.0
+												10.0 15.0 0.0
+												10.0 10.0 0.0
+												10.0 10.0 3.0
+											</gml:posList>
+										</gml:LinearRing>
+									</gml:exterior>
+								</gml:Polygon>
+							</gml:surfaceMember>
+						</gml:MultiSurface>
+					</bldg:lod2MultiSurface>
+				</bldg:WallSurface>
+			</bldg:boundedBy>
+			<bldg:boundedBy>
+				<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4">
+					<bldg:lod2MultiSurface>
+						<gml:MultiSurface>
+							<gml:surfaceMember>
+								<gml:Polygon gml:id="_Simple_BD.1_PG.5">
+									<gml:exterior>
+										<gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1">
+											<gml:posList srsDimension="3">
+												13.0 10.0 0.0
+												13.0 10.0 3.0
+												11.5 10.0 4.5
+												10.0 10.0 3.0
+												10.0 10.0 0.0
+												13.0 10.0 0.0
+											</gml:posList>
+										</gml:LinearRing>
+									</gml:exterior>
+								</gml:Polygon>
+							</gml:surfaceMember>
+						</gml:MultiSurface>
+					</bldg:lod2MultiSurface>
+				</bldg:WallSurface>
+			</bldg:boundedBy>
+			<bldg:boundedBy>
+				<bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1">
+					<bldg:lod2MultiSurface>
+						<gml:MultiSurface>
+							<gml:surfaceMember>
+								<gml:Polygon gml:id="_Simple_BD.1_PG.6">
+									<gml:exterior>
+										<gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1">
+											<gml:posList srsDimension="3">
+												10.0 10.0 3.0
+												11.5 10.0 4.5
+												11.5 15.0 4.5
+												10.0 15.0 3.0
+												10.0 10.0 3.0
+											</gml:posList>
+										</gml:LinearRing>
+									</gml:exterior>
+								</gml:Polygon>
+							</gml:surfaceMember>
+							<gml:surfaceMember>
+								<gml:Polygon gml:id="_Simple_BD.1_PG.7">
+									<gml:exterior>
+										<gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1">
+											<gml:posList srsDimension="3">
+												11.5 10.0 4.5
+												13.0 10.0 3.0
+												13.0 15.0 3.0
+												11.5 15.0 4.5
+												11.5 10.0 4.5
+											</gml:posList>
+										</gml:LinearRing>
+									</gml:exterior>
+								</gml:Polygon>
+							</gml:surfaceMember>
+						</gml:MultiSurface>
+					</bldg:lod2MultiSurface>
+				</bldg:RoofSurface>
+			</bldg:boundedBy>
+			<bldg:boundedBy>
+				<bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1">
+					<bldg:lod2MultiSurface>
+						<gml:MultiSurface>
+							<gml:surfaceMember>
+								<gml:Polygon gml:id="_Simple_BD.1_PG.1">
+									<gml:exterior>
+										<gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1">
+											<gml:posList srsDimension="3">
+												10.0 10.0 0.0
+												10.0 15.0 0.0
+												13.0 15.0 0.0
+												13.0 10.0 0.0
+												10.0 10.0 0.0
+											</gml:posList>
+										</gml:LinearRing>
+									</gml:exterior>
+								</gml:Polygon>
+							</gml:surfaceMember>
+						</gml:MultiSurface>
+					</bldg:lod2MultiSurface>
+				</bldg:GroundSurface>
+			</bldg:boundedBy>
+		</bldg:Building>
+	</core:cityObjectMember>
-- 
GitLab