@@ -54,6 +54,12 @@ def createEmptyLayer():
54
54
return layer
55
55
56
56
57
+ def createEmptyLayerWithFields ():
58
+ layer = QgsVectorLayer ("Point?field=fldtxt:string&field=fldint:integer" , "addfeat" , "memory" )
59
+ assert layer .pendingFeatureCount () == 0
60
+ return layer
61
+
62
+
57
63
def createLayerWithOnePoint ():
58
64
layer = QgsVectorLayer ("Point?field=fldtxt:string&field=fldint:integer" ,
59
65
"addfeat" , "memory" )
@@ -168,8 +174,8 @@ def test_FeatureCount(self):
168
174
# ADD FEATURE
169
175
170
176
def test_AddFeature (self ):
171
- layer = createEmptyLayer ()
172
- feat = QgsFeature ()
177
+ layer = createEmptyLayerWithFields ()
178
+ feat = QgsFeature (layer . fields () )
173
179
feat .setGeometry (QgsGeometry .fromPoint (QgsPoint (1 , 2 )))
174
180
175
181
def checkAfter ():
@@ -197,6 +203,12 @@ def checkBefore():
197
203
198
204
# add feature
199
205
layer .startEditing ()
206
+
207
+ # try adding feature with incorrect number of fields
208
+ bad_feature = QgsFeature ()
209
+ self .assertFalse (layer .addFeature (bad_feature ))
210
+
211
+ # add good feature
200
212
self .assertTrue (layer .addFeature (feat ))
201
213
202
214
checkAfter ()
@@ -213,6 +225,68 @@ def checkBefore():
213
225
checkAfter ()
214
226
self .assertEqual (layer .dataProvider ().featureCount (), 1 )
215
227
228
+ # ADD FEATURES
229
+
230
+ def test_AddFeatures (self ):
231
+ layer = createEmptyLayerWithFields ()
232
+ feat1 = QgsFeature (layer .fields ())
233
+ feat1 .setGeometry (QgsGeometry .fromPoint (QgsPoint (1 , 2 )))
234
+ feat2 = QgsFeature (layer .fields ())
235
+ feat2 .setGeometry (QgsGeometry .fromPoint (QgsPoint (11 , 12 )))
236
+
237
+ def checkAfter ():
238
+ self .assertEqual (layer .pendingFeatureCount (), 2 )
239
+
240
+ # check select+nextFeature
241
+ it = layer .getFeatures ()
242
+ f1 = next (it )
243
+ self .assertEqual (f1 .geometry ().asPoint (), QgsPoint (1 , 2 ))
244
+ f2 = next (it )
245
+ self .assertEqual (f2 .geometry ().asPoint (), QgsPoint (11 , 12 ))
246
+
247
+ # check feature at id
248
+ f1_1 = next (layer .getFeatures (QgsFeatureRequest (f1 .id ())))
249
+ self .assertEqual (f1_1 .geometry ().asPoint (), QgsPoint (1 , 2 ))
250
+ f2_1 = next (layer .getFeatures (QgsFeatureRequest (f2 .id ())))
251
+ self .assertEqual (f2_1 .geometry ().asPoint (), QgsPoint (11 , 12 ))
252
+
253
+ def checkBefore ():
254
+ self .assertEqual (layer .pendingFeatureCount (), 0 )
255
+
256
+ # check select+nextFeature
257
+ with self .assertRaises (StopIteration ):
258
+ next (layer .getFeatures ())
259
+
260
+ checkBefore ()
261
+
262
+ # try to add feature without editing mode
263
+ self .assertFalse (layer .addFeatures ([feat1 , feat2 ]))
264
+
265
+ # add feature
266
+ layer .startEditing ()
267
+
268
+ # try adding feature with incorrect number of fields
269
+ bad_feature = QgsFeature ()
270
+ self .assertFalse (layer .addFeatures ([bad_feature ]))
271
+
272
+ # add good features
273
+ self .assertTrue (layer .addFeatures ([feat1 , feat2 ]))
274
+
275
+ checkAfter ()
276
+ self .assertEqual (layer .dataProvider ().featureCount (), 0 )
277
+
278
+ # now try undo/redo
279
+ layer .undoStack ().undo ()
280
+ layer .undoStack ().undo ()
281
+ checkBefore ()
282
+ layer .undoStack ().redo ()
283
+ layer .undoStack ().redo ()
284
+ checkAfter ()
285
+
286
+ self .assertTrue (layer .commitChanges ())
287
+
288
+ checkAfter ()
289
+ self .assertEqual (layer .dataProvider ().featureCount (), 2 )
216
290
# DELETE FEATURE
217
291
218
292
def test_DeleteFeature (self ):
0 commit comments