Skip to content

Commit 373a1ac

Browse files
committedJan 13, 2023
Add splitParts unittest
1 parent 19cae9d commit 373a1ac

File tree

1 file changed

+62
-3
lines changed

1 file changed

+62
-3
lines changed
 

‎tests/src/python/test_qgsvectorlayereditutils.py

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,21 @@
4444
start_app()
4545

4646

47-
def createEmptyPolygonLayer():
48-
layer = QgsVectorLayer("Polygon",
49-
"polygon", "memory")
47+
def createEmptyLayer(geomType):
48+
layer = QgsVectorLayer(geomType,
49+
geomType.lower(), "memory")
5050
assert layer.isValid()
5151
return layer
5252

5353

54+
def createEmptyPolygonLayer():
55+
return createEmptyLayer("Polygon")
56+
57+
58+
def createEmptyMultiPolygonLayer():
59+
return createEmptyLayer("MultiPolygon")
60+
61+
5462
class TestQgsVectorLayerEditUtils(unittest.TestCase):
5563

5664
def testAddRing(self):
@@ -272,6 +280,57 @@ def testAddRingV2SelectedFeatures(self):
272280
"Polygon ((2 2, 6 2, 6 6, 2 6, 2 2))"
273281
)
274282

283+
def testSplitParts(self):
284+
layer = createEmptyMultiPolygonLayer()
285+
self.assertTrue(layer.startEditing())
286+
287+
pr = layer.dataProvider()
288+
289+
# Add three MultiPolygon features
290+
# Each feature is composed of two squares side by side
291+
# Each feature is on a separate row to form a 3*2 grid
292+
f = QgsFeature(layer.fields(), 1)
293+
f.setGeometry(QgsGeometry.fromWkt('MULTIPOLYGON(((0 0, 4 0, 4 4, 0 4, 0 0)), ((6 0, 10 0, 10 4, 6 4, 6 0)))'))
294+
assert pr.addFeatures([f])
295+
296+
f = QgsFeature(layer.fields(), 2)
297+
f.setGeometry(QgsGeometry.fromWkt('MULTIPOLYGON(((0 6, 4 6, 4 10, 0 10, 0 6)), ((6 6, 10 6, 10 10, 6 10, 6 6)))'))
298+
assert pr.addFeatures([f])
299+
300+
f = QgsFeature(layer.fields(), 3)
301+
f.setGeometry(QgsGeometry.fromWkt('MULTIPOLYGON(((0 12, 4 12, 4 16, 0 16, 0 12)), ((6 12, 10 12, 10 16, 6 16, 6 12)))'))
302+
assert pr.addFeatures([f])
303+
304+
self.assertEqual(layer.featureCount(), 3)
305+
306+
vle = QgsVectorLayerEditUtils(layer)
307+
308+
# Split the first feature with a horizontal line that crosses both its parts
309+
# After this operation, the first feature has 4 parts, the other two are unchanged
310+
result = vle.splitParts([QgsPointXY(0, 2), QgsPointXY(10, 2)], False)
311+
self.assertEqual(result, Qgis.GeometryOperationResult.Success)
312+
313+
# Split all three features with a vertical Line
314+
# After this operation, the first feature has 6 parts, the other two have 6 parts
315+
result = vle.splitParts([QgsPointXY(2, 0), QgsPointXY(2, 16)], False)
316+
self.assertEqual(result, Qgis.GeometryOperationResult.Success)
317+
318+
layer.commitChanges()
319+
320+
self.assertEqual(
321+
layer.getFeature(1).geometry().asWkt(),
322+
'MultiPolygon (((2 0, 2 2, 4 2, 4 0, 2 0)),((2 2, 2 0, 0 0, 0 2, 2 2)),((2 2, 2 4, 4 4, 4 2, 2 2)),((2 4, 2 2, 0 2, 0 4, 2 4)),((6 2, 10 2, 10 0, 6 0, 6 2)),((10 2, 6 2, 6 4, 10 4, 10 2)))'
323+
)
324+
self.assertEqual(
325+
layer.getFeature(2).geometry().asWkt(),
326+
'MultiPolygon (((2 6, 2 10, 4 10, 4 6, 2 6)),((2 10, 2 6, 0 6, 0 10, 2 10)),((6 6, 10 6, 10 10, 6 10, 6 6)))'
327+
)
328+
329+
self.assertEqual(
330+
layer.getFeature(3).geometry().asWkt(),
331+
'MultiPolygon (((2 12, 2 16, 4 16, 4 12, 2 12)),((2 16, 2 12, 0 12, 0 16, 2 16)),((6 12, 10 12, 10 16, 6 16, 6 12)))'
332+
)
333+
275334

276335
if __name__ == '__main__':
277336
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.