@@ -150,12 +150,12 @@ def testWillRenderFeatureNestedElse(self):
150
150
vl .setRenderer (QgsRuleBasedRenderer (rootrule ))
151
151
renderer = vl .renderer ()
152
152
153
- # Reunder with else rule and all activated
153
+ # Render with else rule and all activated
154
154
renderer .startRender (ctx , vl .fields ())
155
155
self .assertTrue (renderer .willRenderFeature (ft , ctx ))
156
156
renderer .stopRender (ctx )
157
157
158
- # Reunder with else rule where else is deactivated
158
+ # Render with else rule where else is deactivated
159
159
renderer .rootRule ().children ()[1 ].setActive (False )
160
160
renderer .startRender (ctx , vl .fields ())
161
161
self .assertFalse (renderer .willRenderFeature (ft , ctx ))
@@ -333,6 +333,45 @@ def testConvertFromGraduatedRenderer(self):
333
333
self .assertEqual (r .rootRule ().children ()[0 ].filterExpression (), '"id" >= 0.000000 AND "id" <= 1.000000' )
334
334
self .assertEqual (r .rootRule ().children ()[1 ].filterExpression (), '"id" > 1.000000 AND "id" <= 2.000000' )
335
335
336
+ def testWillRenderFeatureTwoElse (self ):
337
+ """Regression #21287, also test rulesForFeature since there were no tests any where and I've found a couple of issues"""
338
+
339
+ vl = self .mapsettings .layers ()[0 ]
340
+ ft = vl .getFeature (0 ) # 'id' = 1
341
+
342
+ ctx = QgsRenderContext .fromMapSettings (self .mapsettings )
343
+ ctx .expressionContext ().setFeature (ft )
344
+
345
+ # Create rulebased style
346
+ sym2 = QgsFillSymbol .createSimple ({'color' : '#71bd6c' , 'outline_color' : 'black' })
347
+ sym3 = QgsFillSymbol .createSimple ({'color' : '#1f78b4' , 'outline_color' : 'black' })
348
+ sym4 = QgsFillSymbol .createSimple ({'color' : '#ff00ff' , 'outline_color' : 'black' })
349
+
350
+ self .rx2 = QgsRuleBasedRenderer .Rule (sym2 , 0 , 0 , '"id" = 200' )
351
+ self .rx3 = QgsRuleBasedRenderer .Rule (sym3 , 1000 , 100000000 , 'ELSE' ) # <<< - match this!
352
+ self .rx4 = QgsRuleBasedRenderer .Rule (sym4 , 0.1 , 999 , 'ELSE' )
353
+
354
+ rootrule = QgsRuleBasedRenderer .Rule (None )
355
+ rootrule .appendChild (self .rx2 )
356
+ rootrule .appendChild (self .rx3 )
357
+ rootrule .appendChild (self .rx4 ) # <- failed in regression #21287
358
+
359
+ vl .setRenderer (QgsRuleBasedRenderer (rootrule ))
360
+ renderer = vl .renderer ()
361
+
362
+ # Render with else rule and all activated
363
+ renderer .startRender (ctx , vl .fields ())
364
+ self .assertTrue (renderer .willRenderFeature (ft , ctx ))
365
+
366
+ # No context? All rules
367
+ self .assertEqual (len (rootrule .rulesForFeature (ft )), 2 )
368
+ self .assertTrue (set (rootrule .rulesForFeature (ft )), set ([self .rx3 , self .rx4 ]))
369
+
370
+ # With context: only the matching one
371
+ self .assertEqual (len (rootrule .rulesForFeature (ft , ctx )), 1 )
372
+ self .assertEqual (rootrule .rulesForFeature (ft , ctx )[0 ], self .rx3 )
373
+ renderer .stopRender (ctx )
374
+
336
375
337
376
if __name__ == '__main__' :
338
377
unittest .main ()
0 commit comments