Skip to content

Commit c7ab2d2

Browse files
committedNov 4, 2020
More unit tests for geometry validation
1 parent 2f10e50 commit c7ab2d2

File tree

2 files changed

+158
-5
lines changed

2 files changed

+158
-5
lines changed
 

‎src/core/qgsgeometryvalidator.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,10 @@ void QgsGeometryValidator::checkRingIntersections( int partIndex0, int ringIndex
6868
ring0->pointN( i + 1 ) != ring1->pointN( j + 1 ) && ring0->pointN( i + 1 ) != ring1->pointN( j ) &&
6969
ring0->pointN( i + 0 ) != ring1->pointN( j + 1 ) && ring0->pointN( i + 0 ) != ring1->pointN( j ) )
7070
{
71-
QString msg = QObject::tr( "segment %1 of ring %2 of polygon %3 intersects segment %4 of ring %5 of polygon %6 at %7, %8" )
72-
.arg( i ).arg( ringIndex0 ).arg( partIndex0 )
73-
.arg( j ).arg( ringIndex1 ).arg( partIndex1 )
74-
.arg( sX ).arg( sY );
75-
QgsDebugMsg( msg );
71+
const QString msg = QObject::tr( "segment %1 of ring %2 of polygon %3 intersects segment %4 of ring %5 of polygon %6 at %7, %8" )
72+
.arg( i ).arg( ringIndex0 ).arg( partIndex0 )
73+
.arg( j ).arg( ringIndex1 ).arg( partIndex1 )
74+
.arg( sX ).arg( sY );
7675
emit errorFound( QgsGeometry::Error( msg, QgsPointXY( sX, sY ) ) );
7776
mErrorCount++;
7877
}

‎tests/src/python/test_qgsgeometryvalidator.py

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,160 @@ def test_ring_intersections(self):
108108
self.assertEqual(spy[1][0].where(), QgsPointXY(2, 7))
109109
self.assertEqual(spy[1][0].what(), 'segment 1 of ring 1 of polygon 0 intersects segment 2 of ring 2 of polygon 0 at 2, 7')
110110

111+
def test_line_vertices(self):
112+
# valid line
113+
g = QgsGeometry.fromWkt("LineString (0 0, 10 0)")
114+
115+
validator = QgsGeometryValidator(g)
116+
spy = QSignalSpy(validator.errorFound)
117+
validator.run()
118+
self.assertEqual(len(spy), 0)
119+
120+
# not enough vertices
121+
g = QgsGeometry.fromWkt("LineString (1 0)")
122+
123+
validator = QgsGeometryValidator(g)
124+
spy = QSignalSpy(validator.errorFound)
125+
validator.run()
126+
self.assertEqual(len(spy), 1)
127+
128+
self.assertEqual(spy[0][0].where(), QgsPointXY())
129+
self.assertEqual(spy[0][0].what(), 'line 0 with less than two points')
130+
131+
g = QgsGeometry.fromWkt("LineString ()")
132+
133+
validator = QgsGeometryValidator(g)
134+
spy = QSignalSpy(validator.errorFound)
135+
validator.run()
136+
self.assertEqual(len(spy), 1)
137+
138+
self.assertEqual(spy[0][0].where(), QgsPointXY())
139+
self.assertEqual(spy[0][0].what(), 'line 0 with less than two points')
140+
141+
def test_ring_vertex_count(self):
142+
# valid ring
143+
g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 10 10, 0 0))")
144+
145+
validator = QgsGeometryValidator(g)
146+
spy = QSignalSpy(validator.errorFound)
147+
validator.run()
148+
self.assertEqual(len(spy), 0)
149+
150+
# not enough vertices
151+
g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 10 10))")
152+
153+
validator = QgsGeometryValidator(g)
154+
spy = QSignalSpy(validator.errorFound)
155+
validator.run()
156+
self.assertEqual(len(spy), 1)
157+
158+
self.assertEqual(spy[0][0].where(), QgsPointXY())
159+
self.assertEqual(spy[0][0].what(), 'ring 0 with less than four points')
160+
161+
g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 0 0))")
162+
163+
validator = QgsGeometryValidator(g)
164+
spy = QSignalSpy(validator.errorFound)
165+
validator.run()
166+
self.assertEqual(len(spy), 1)
167+
168+
self.assertEqual(spy[0][0].where(), QgsPointXY())
169+
self.assertEqual(spy[0][0].what(), 'ring 0 with less than four points')
170+
171+
g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0))")
172+
173+
validator = QgsGeometryValidator(g)
174+
spy = QSignalSpy(validator.errorFound)
175+
validator.run()
176+
self.assertEqual(len(spy), 1)
177+
178+
self.assertEqual(spy[0][0].where(), QgsPointXY())
179+
self.assertEqual(spy[0][0].what(), 'ring 0 with less than four points')
180+
181+
g = QgsGeometry.fromWkt("Polygon ((0 0))")
182+
183+
validator = QgsGeometryValidator(g)
184+
spy = QSignalSpy(validator.errorFound)
185+
validator.run()
186+
self.assertEqual(len(spy), 1)
187+
188+
self.assertEqual(spy[0][0].where(), QgsPointXY())
189+
self.assertEqual(spy[0][0].what(), 'ring 0 with less than four points')
190+
191+
g = QgsGeometry.fromWkt("Polygon (())")
192+
193+
validator = QgsGeometryValidator(g)
194+
spy = QSignalSpy(validator.errorFound)
195+
validator.run()
196+
self.assertEqual(len(spy), 0)
197+
198+
g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 10 10, 0 0),(1 1, 2 1, 2 2))")
199+
200+
validator = QgsGeometryValidator(g)
201+
spy = QSignalSpy(validator.errorFound)
202+
validator.run()
203+
self.assertEqual(len(spy), 1)
204+
205+
self.assertEqual(spy[0][0].where(), QgsPointXY())
206+
self.assertEqual(spy[0][0].what(), 'ring 1 with less than four points')
207+
208+
g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 10 10, 0 0),(1 1, 2 1, 2 2, 1 1))")
209+
210+
validator = QgsGeometryValidator(g)
211+
spy = QSignalSpy(validator.errorFound)
212+
validator.run()
213+
self.assertEqual(len(spy), 0)
214+
215+
g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 2 1, 2 2, 1 1),(3 3, 3 4, 4 4))")
216+
217+
validator = QgsGeometryValidator(g)
218+
spy = QSignalSpy(validator.errorFound)
219+
validator.run()
220+
self.assertEqual(len(spy), 1)
221+
222+
self.assertEqual(spy[0][0].where(), QgsPointXY())
223+
self.assertEqual(spy[0][0].what(), 'ring 2 with less than four points')
224+
225+
def test_ring_closed(self):
226+
# valid ring
227+
g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 10 10, 0 0))")
228+
229+
validator = QgsGeometryValidator(g)
230+
spy = QSignalSpy(validator.errorFound)
231+
validator.run()
232+
self.assertEqual(len(spy), 0)
233+
234+
# not closed
235+
g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 10 10, 1 1))")
236+
237+
validator = QgsGeometryValidator(g)
238+
spy = QSignalSpy(validator.errorFound)
239+
validator.run()
240+
self.assertEqual(len(spy), 1)
241+
242+
self.assertEqual(spy[0][0].where(), QgsPointXY())
243+
self.assertEqual(spy[0][0].what(), 'ring 0 not closed')
244+
245+
g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 10 10, 0 0),(1 1, 2 1, 2 2, 1.1 1))")
246+
247+
validator = QgsGeometryValidator(g)
248+
spy = QSignalSpy(validator.errorFound)
249+
validator.run()
250+
self.assertEqual(len(spy), 1)
251+
252+
self.assertEqual(spy[0][0].where(), QgsPointXY())
253+
self.assertEqual(spy[0][0].what(), 'ring 1 not closed')
254+
255+
g = QgsGeometry.fromWkt("Polygon ((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 2 1, 2 2, 1 1),(3 3, 3 4, 4 4, 3.1 3))")
256+
257+
validator = QgsGeometryValidator(g)
258+
spy = QSignalSpy(validator.errorFound)
259+
validator.run()
260+
self.assertEqual(len(spy), 1)
261+
262+
self.assertEqual(spy[0][0].where(), QgsPointXY())
263+
self.assertEqual(spy[0][0].what(), 'ring 2 not closed')
264+
111265

112266
if __name__ == '__main__':
113267
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.