mirror of
https://github.com/qgis/QGIS.git
synced 2025-10-06 00:07:29 -04:00
Add labeling composer unit tests and control images
- Initial support for image output at 72 dpi - Comparison against canvas output has slight shift (needs fixed)
This commit is contained in:
parent
c4a60de06c
commit
203d67f628
@ -30,7 +30,7 @@ ADD_PYTHON_TEST(PyQgsComposerLabel test_qgscomposerlabel.py)
|
|||||||
ADD_PYTHON_TEST(PyQgsExpression test_qgsexpression.py)
|
ADD_PYTHON_TEST(PyQgsExpression test_qgsexpression.py)
|
||||||
ADD_PYTHON_TEST(PyQgsPalLabelingBase test_qgspallabeling_base.py)
|
ADD_PYTHON_TEST(PyQgsPalLabelingBase test_qgspallabeling_base.py)
|
||||||
ADD_PYTHON_TEST(PyQgsPalLabelingCanvas test_qgspallabeling_canvas.py)
|
ADD_PYTHON_TEST(PyQgsPalLabelingCanvas test_qgspallabeling_canvas.py)
|
||||||
#ADD_PYTHON_TEST(PyQgsPalLabelingComposer test_qgspallabeling_composer.py)
|
ADD_PYTHON_TEST(PyQgsPalLabelingComposer test_qgspallabeling_composer.py)
|
||||||
ADD_PYTHON_TEST(PyQgsPalLabelingServer test_qgspallabeling_server.py)
|
ADD_PYTHON_TEST(PyQgsPalLabelingServer test_qgspallabeling_server.py)
|
||||||
ADD_PYTHON_TEST(PyQgsVectorFileWriter test_qgsvectorfilewriter.py)
|
ADD_PYTHON_TEST(PyQgsVectorFileWriter test_qgsvectorfilewriter.py)
|
||||||
ADD_PYTHON_TEST(PyQgsSpatialiteProvider test_qgsspatialiteprovider.py)
|
ADD_PYTHON_TEST(PyQgsSpatialiteProvider test_qgsspatialiteprovider.py)
|
||||||
|
163
tests/src/python/test_qgspallabeling_composer.py
Normal file
163
tests/src/python/test_qgspallabeling_composer.py
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""QGIS unit tests for QgsPalLabeling: label rendering to composer
|
||||||
|
|
||||||
|
From build dir: ctest -R PyQgsPalLabelingComposer -V
|
||||||
|
Set the following env variables when manually running tests:
|
||||||
|
PAL_SUITE to run specific tests (define in __main__)
|
||||||
|
PAL_VERBOSE to output individual test summary
|
||||||
|
PAL_CONTROL_IMAGE to trigger building of new control images
|
||||||
|
PAL_REPORT to open any failed image check reports in web browser
|
||||||
|
|
||||||
|
.. note:: This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
"""
|
||||||
|
|
||||||
|
__author__ = 'Larry Shaffer'
|
||||||
|
__date__ = '2014/02/21'
|
||||||
|
__copyright__ = 'Copyright 2013, The QGIS Project'
|
||||||
|
# This will get replaced with a git SHA1 when you do a git archive
|
||||||
|
__revision__ = '$Format:%H$'
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import tempfile
|
||||||
|
from PyQt4.QtCore import *
|
||||||
|
from PyQt4.QtGui import *
|
||||||
|
|
||||||
|
from qgis.core import *
|
||||||
|
|
||||||
|
from utilities import (
|
||||||
|
unittest,
|
||||||
|
expectedFailure,
|
||||||
|
)
|
||||||
|
|
||||||
|
from test_qgspallabeling_base import TestQgsPalLabeling, runSuite
|
||||||
|
from test_qgspallabeling_tests import TestPointBase
|
||||||
|
|
||||||
|
|
||||||
|
# noinspection PyShadowingNames
|
||||||
|
class TestComposerBase(TestQgsPalLabeling):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
TestQgsPalLabeling.setUpClass()
|
||||||
|
# the blue background (set via layer style) to match renderchecker's
|
||||||
|
cls._BkgrdLayer = TestQgsPalLabeling.loadFeatureLayer('background')
|
||||||
|
cls._CheckMismatch = 0 # mismatch expected for crosscheck
|
||||||
|
cls._CheckGroup = ''
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tearDownClass(cls):
|
||||||
|
"""Run after all tests"""
|
||||||
|
TestQgsPalLabeling.tearDownClass()
|
||||||
|
|
||||||
|
def get_composer_image(self, width=600, height=400, dpi=72):
|
||||||
|
# set up composition and add map
|
||||||
|
comp = QgsComposition(self._MapRenderer)
|
||||||
|
""":type: QgsComposition"""
|
||||||
|
comp.setPrintResolution(dpi)
|
||||||
|
# 600 x 400 px = 211.67 x 141.11 mm @ 72 dpi
|
||||||
|
# TODO: figure out why this doesn't work and needs fudging
|
||||||
|
# probably need sets of fudgyness per dpi group (72, 150, 300)?
|
||||||
|
paperw = round((width * 25.4 / dpi) + 0.05, 0)
|
||||||
|
paperh = round((height * 25.4 / dpi) + 0.05, 1)
|
||||||
|
comp.setPaperSize(paperw, paperh)
|
||||||
|
compmap = QgsComposerMap(
|
||||||
|
comp, 0, 0, comp.paperWidth(), comp.paperHeight())
|
||||||
|
""":type: QgsComposerMap"""
|
||||||
|
compmap.setFrameEnabled(False)
|
||||||
|
comp.addComposerMap(compmap)
|
||||||
|
compmap.setNewExtent(self.aoiExtent())
|
||||||
|
|
||||||
|
comp.setPlotStyle(QgsComposition.Print)
|
||||||
|
dpi = comp.printResolution()
|
||||||
|
dpmm = dpi / 25.4
|
||||||
|
img_width = int(dpmm * comp.paperWidth())
|
||||||
|
img_height = int(dpmm * comp.paperHeight())
|
||||||
|
|
||||||
|
# create output image and initialize it
|
||||||
|
image = QImage(QSize(img_width, img_height), QImage.Format_ARGB32)
|
||||||
|
image.setDotsPerMeterX(dpmm * 1000)
|
||||||
|
image.setDotsPerMeterY(dpmm * 1000)
|
||||||
|
image.fill(QColor(152, 219, 249).rgb())
|
||||||
|
|
||||||
|
# render the composition
|
||||||
|
p = QPainter(image)
|
||||||
|
p.setRenderHint(QPainter.Antialiasing)
|
||||||
|
src = QRectF(0, 0, comp.paperWidth(), comp.paperHeight())
|
||||||
|
trgt = QRectF(0, 0, img_width, img_height)
|
||||||
|
comp.render(p, trgt, src)
|
||||||
|
p.end()
|
||||||
|
|
||||||
|
tmp = tempfile.NamedTemporaryFile(suffix=".png", delete=False)
|
||||||
|
filepath = tmp.name
|
||||||
|
tmp.close()
|
||||||
|
|
||||||
|
res = image.save(filepath, "png")
|
||||||
|
if not res:
|
||||||
|
os.unlink(filepath)
|
||||||
|
filepath = ''
|
||||||
|
|
||||||
|
return res, filepath
|
||||||
|
|
||||||
|
|
||||||
|
class TestComposerPoint(TestComposerBase, TestPointBase):
|
||||||
|
|
||||||
|
_TestImage = ''
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
TestComposerBase.setUpClass()
|
||||||
|
cls.layer = TestQgsPalLabeling.loadFeatureLayer('point')
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
"""Run before each test."""
|
||||||
|
self.configTest('pal_composer', 'sp')
|
||||||
|
TestQgsPalLabeling.setDefaultEngineSettings()
|
||||||
|
self.lyr = self.defaultSettings()
|
||||||
|
self._TestImage = ''
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
"""Run after each test."""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def checkTest(self, **kwargs):
|
||||||
|
self.lyr.writeToLayer(self.layer)
|
||||||
|
res_m, self._TestImage = self.get_composer_image()
|
||||||
|
self.saveContolImage(self._TestImage)
|
||||||
|
self.assertTrue(res_m, 'Failed to retrieve/save image from test server')
|
||||||
|
# gp = kwargs['grpprefix'] if 'grpprefix' in kwargs else ''
|
||||||
|
self.assertTrue(*self.renderCheck(mismatch=self._CheckMismatch,
|
||||||
|
imgpath=self._TestImage,
|
||||||
|
grpprefix=self._CheckGroup))
|
||||||
|
|
||||||
|
|
||||||
|
class TestComposerVsCanvasPoint(TestComposerPoint):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
TestComposerPoint.setUpClass()
|
||||||
|
cls._CheckGroup = 'pal_canvas'
|
||||||
|
cls._CheckMismatch = 2700 # rounding errors on composer output?
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# NOTE: unless PAL_SUITE env var is set all test class methods will be run
|
||||||
|
# ex: 'TestGroup(Point|Line|Curved|Polygon|Feature).test_method'
|
||||||
|
suite = [
|
||||||
|
'TestComposerPoint.test_default_label',
|
||||||
|
'TestComposerPoint.test_text_size_map_unit',
|
||||||
|
'TestComposerPoint.test_text_color',
|
||||||
|
'TestComposerPoint.test_partials_labels_enabled',
|
||||||
|
'TestComposerPoint.test_partials_labels_disabled',
|
||||||
|
|
||||||
|
'TestComposerVsCanvasPoint.test_default_label',
|
||||||
|
'TestComposerVsCanvasPoint.test_text_size_map_unit',
|
||||||
|
'TestComposerVsCanvasPoint.test_text_color',
|
||||||
|
'TestComposerVsCanvasPoint.test_partials_labels_enabled',
|
||||||
|
'TestComposerVsCanvasPoint.test_partials_labels_disabled',
|
||||||
|
]
|
||||||
|
res = runSuite(sys.modules[__name__], suite)
|
||||||
|
sys.exit(not res.wasSuccessful())
|
BIN
tests/testdata/control_images/expected_pal_composer/sp_default_label/sp_default_label.png
vendored
Normal file
BIN
tests/testdata/control_images/expected_pal_composer/sp_default_label/sp_default_label.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.9 KiB |
Binary file not shown.
After Width: | Height: | Size: 2.1 KiB |
Binary file not shown.
After Width: | Height: | Size: 9.8 KiB |
BIN
tests/testdata/control_images/expected_pal_composer/sp_text_color/sp_text_color.png
vendored
Normal file
BIN
tests/testdata/control_images/expected_pal_composer/sp_text_color/sp_text_color.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.1 KiB |
BIN
tests/testdata/control_images/expected_pal_composer/sp_text_size_map_unit/sp_text_size_map_unit.png
vendored
Normal file
BIN
tests/testdata/control_images/expected_pal_composer/sp_text_size_map_unit/sp_text_size_map_unit.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.6 KiB |
Loading…
x
Reference in New Issue
Block a user