@@ -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 ))
@@ -324,6 +324,45 @@ def testConvertFromGraduatedRenderer(self):
324
324
self .assertEqual (r .rootRule ().children ()[0 ].filterExpression (), '"id" >= 0.000000 AND "id" <= 1.000000' )
325
325
self .assertEqual (r .rootRule ().children ()[1 ].filterExpression (), '"id" > 1.000000 AND "id" <= 2.000000' )
326
326
327
+ def testWillRenderFeatureTwoElse (self ):
328
+ """Regression #21287, also test rulesForFeature since there were no tests any where and I've found a couple of issues"""
329
+
330
+ vl = self .mapsettings .layers ()[0 ]
331
+ ft = vl .getFeature (0 ) # 'id' = 1
332
+
333
+ ctx = QgsRenderContext .fromMapSettings (self .mapsettings )
334
+ ctx .expressionContext ().setFeature (ft )
335
+
336
+ # Create rulebased style
337
+ sym2 = QgsFillSymbol .createSimple ({'color' : '#71bd6c' , 'outline_color' : 'black' })
338
+ sym3 = QgsFillSymbol .createSimple ({'color' : '#1f78b4' , 'outline_color' : 'black' })
339
+ sym4 = QgsFillSymbol .createSimple ({'color' : '#ff00ff' , 'outline_color' : 'black' })
340
+
341
+ self .rx2 = QgsRuleBasedRenderer .Rule (sym2 , 0 , 0 , '"id" = 200' )
342
+ self .rx3 = QgsRuleBasedRenderer .Rule (sym3 , 1000 , 100000000 , 'ELSE' ) # <<< - match this!
343
+ self .rx4 = QgsRuleBasedRenderer .Rule (sym4 , 0.1 , 999 , 'ELSE' )
344
+
345
+ rootrule = QgsRuleBasedRenderer .Rule (None )
346
+ rootrule .appendChild (self .rx2 )
347
+ rootrule .appendChild (self .rx3 )
348
+ rootrule .appendChild (self .rx4 ) # <- failed in regression #21287
349
+
350
+ vl .setRenderer (QgsRuleBasedRenderer (rootrule ))
351
+ renderer = vl .renderer ()
352
+
353
+ # Render with else rule and all activated
354
+ renderer .startRender (ctx , vl .fields ())
355
+ self .assertTrue (renderer .willRenderFeature (ft , ctx ))
356
+
357
+ # No context? All rules
358
+ self .assertEqual (len (rootrule .rulesForFeature (ft )), 2 )
359
+ self .assertTrue (set (rootrule .rulesForFeature (ft )), set ([self .rx3 , self .rx4 ]))
360
+
361
+ # With context: only the matching one
362
+ self .assertEqual (len (rootrule .rulesForFeature (ft , ctx )), 1 )
363
+ self .assertEqual (rootrule .rulesForFeature (ft , ctx )[0 ], self .rx3 )
364
+ renderer .stopRender (ctx )
365
+
327
366
328
367
if __name__ == '__main__' :
329
368
unittest .main ()
0 commit comments