Skip to content

Commit 6243f78

Browse files
committed
Add a unit test for map render job cancelation
1 parent 3b56b79 commit 6243f78

File tree

1 file changed

+51
-1
lines changed

1 file changed

+51
-1
lines changed

tests/src/python/test_qgsmaprenderer.py

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,14 @@
2323
QgsProject,
2424
QgsFeature,
2525
QgsGeometry,
26-
QgsMapSettings)
26+
QgsMapSettings,
27+
QgsPoint)
2728
from qgis.testing import start_app, unittest
2829
from qgis.PyQt.QtCore import QSize, QThreadPool
2930
from qgis.PyQt.QtGui import QPainter, QImage
31+
from qgis.PyQt.QtTest import QSignalSpy
32+
from random import uniform
33+
3034

3135
app = start_app()
3236

@@ -378,6 +382,51 @@ def checkLabeledLayerWithBlendModesCannotBeCached(self, job_type):
378382
self.assertFalse(cache.hasCacheImage('_labels_'))
379383
self.assertTrue(job.takeLabelingResults())
380384

385+
def checkCancel(self, job_type):
386+
"""test canceling a render job"""
387+
layer = QgsVectorLayer("Point?field=fldtxt:string",
388+
"layer1", "memory")
389+
390+
# add a ton of random points
391+
for i in range(2000):
392+
x = uniform(5, 25)
393+
y = uniform(25, 45)
394+
g = QgsGeometry.fromPoint(QgsPoint(x, y))
395+
f = QgsFeature()
396+
f.setGeometry(g)
397+
f.initAttributes(1)
398+
layer.dataProvider().addFeatures([f])
399+
400+
settings = QgsMapSettings()
401+
settings.setExtent(QgsRectangle(5, 25, 25, 45))
402+
settings.setOutputSize(QSize(600, 400))
403+
settings.setLayers([layer])
404+
405+
# first try non-blocking cancelWithoutBlocking() call
406+
job = job_type(settings)
407+
finished_spy = QSignalSpy(job.finished)
408+
job.start()
409+
410+
# insta cancel!
411+
job.cancelWithoutBlocking()
412+
# should still be active immediately after
413+
self.assertTrue(job.isActive())
414+
415+
while job.isActive():
416+
app.processEvents()
417+
self.assertEqual(len(finished_spy), 1)
418+
419+
# try blocking cancel() call
420+
job = job_type(settings)
421+
finished_spy = QSignalSpy(job.finished)
422+
job.start()
423+
424+
# insta cancel!
425+
job.cancel()
426+
# should not be active anymore
427+
self.assertFalse(job.isActive())
428+
self.assertEqual(len(finished_spy), 1)
429+
381430
def runRendererChecks(self, renderer):
382431
""" runs all checks on the specified renderer """
383432
self.checkRendererUseCachedLabels(renderer)
@@ -388,6 +437,7 @@ def runRendererChecks(self, renderer):
388437
self.checkAddingNewNonLabeledLayerKeepsLabelCache(renderer)
389438
self.checkRemovingNonLabeledLayerKeepsLabelCache(renderer)
390439
self.checkLabeledLayerWithBlendModesCannotBeCached(renderer)
440+
self.checkCancel(renderer)
391441

392442
def testParallelRenderer(self):
393443
""" run test suite on QgsMapRendererParallelJob"""

0 commit comments

Comments
 (0)