From 253e13154ea45a8c2da21339d5614e3dfd3c8b4c Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Mon, 24 Aug 2015 16:08:24 +1000 Subject: [PATCH] Start on placement test suite for labeling Sponsored by City of Uster --- tests/src/python/CMakeLists.txt | 1 + .../python/test_qgspallabeling_placement.py | 131 +++++++ .../sp_point_placement_around.png | Bin 0 -> 1487 bytes .../sp_point_placement_around_mask.png | Bin 0 -> 1231 bytes .../sp_point_placement_around_obstacle.png | Bin 0 -> 1708 bytes ...p_point_placement_around_obstacle_mask.png | Bin 0 -> 1389 bytes .../testdata/labeling/pal_features_v3.sqlite | Bin 265216 -> 79872 bytes tests/testdata/labeling/point2.qml | 339 ++++++++++++++++++ 8 files changed, 471 insertions(+) create mode 100644 tests/src/python/test_qgspallabeling_placement.py create mode 100644 tests/testdata/control_images/expected_pal_placement/sp_point_placement_around/sp_point_placement_around.png create mode 100644 tests/testdata/control_images/expected_pal_placement/sp_point_placement_around/sp_point_placement_around_mask.png create mode 100644 tests/testdata/control_images/expected_pal_placement/sp_point_placement_around_obstacle/sp_point_placement_around_obstacle.png create mode 100644 tests/testdata/control_images/expected_pal_placement/sp_point_placement_around_obstacle/sp_point_placement_around_obstacle_mask.png create mode 100644 tests/testdata/labeling/point2.qml diff --git a/tests/src/python/CMakeLists.txt b/tests/src/python/CMakeLists.txt index 70054bbbca42..fcd579d519da 100644 --- a/tests/src/python/CMakeLists.txt +++ b/tests/src/python/CMakeLists.txt @@ -41,6 +41,7 @@ ADD_PYTHON_TEST(PyQgsExpression test_qgsexpression.py) ADD_PYTHON_TEST(PyQgsPalLabelingBase test_qgspallabeling_base.py) ADD_PYTHON_TEST(PyQgsPalLabelingCanvas test_qgspallabeling_canvas.py) ADD_PYTHON_TEST(PyQgsPalLabelingComposer test_qgspallabeling_composer.py) +ADD_PYTHON_TEST(PyQgsPalLabelingPlacement test_qgspallabeling_placement.py) ADD_PYTHON_TEST(PyQgsVectorFileWriter test_qgsvectorfilewriter.py) ADD_PYTHON_TEST(PyQgsZonalStatistics test_qgszonalstatistics.py) ADD_PYTHON_TEST(PyQgsDistanceArea test_qgsdistancearea.py) diff --git a/tests/src/python/test_qgspallabeling_placement.py b/tests/src/python/test_qgspallabeling_placement.py new file mode 100644 index 000000000000..b4be858063f3 --- /dev/null +++ b/tests/src/python/test_qgspallabeling_placement.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +"""QGIS Unit tests for QgsPalLabeling: base suite of render check tests + +Class is meant to be inherited by classes that test different labeling outputs + +See /tests/testdata/labeling/README.rst for description. + +.. 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__ = 'Nyall Dawson' +__date__ = '2015-08-24' +__copyright__ = 'Copyright 2015, The QGIS Project' +# This will get replaced with a git SHA1 when you do a git archive +__revision__ = '$Format:%H$' + +import qgis +import os +import sys + +from PyQt4.QtCore import Qt, QPointF, QThreadPool +from PyQt4.QtGui import QFont + +from qgis.core import QgsPalLayerSettings + +from utilities import ( + svgSymbolsPath, + getTempfilePath, + renderMapToImage, + mapSettingsString +) + +from test_qgspallabeling_base import TestQgsPalLabeling, runSuite + + +# noinspection PyPep8Naming +class TestPlacementBase(TestQgsPalLabeling): + + @classmethod + def setUpClass(cls): + if not cls._BaseSetup: + TestQgsPalLabeling.setUpClass() + cls._Pal.setDrawLabelRectOnly(True) + cls._Pal.saveEngineSettings() + + @classmethod + def tearDownClass(cls): + TestQgsPalLabeling.tearDownClass() + #avoid crash on finish, probably related to https://bugreports.qt.io/browse/QTBUG-35760 + QThreadPool.globalInstance().waitForDone() + + def setUp(self): + """Run before each test.""" + super(TestPlacementBase, self).setUp() + self.configTest('pal_placement', 'sp') + self._TestImage = '' + # ensure per test map settings stay encapsulated + self._TestMapSettings = self.cloneMapSettings(self._MapSettings) + self._Mismatch = 0 + self._ColorTol = 0 + self._Mismatches.clear() + self._ColorTols.clear() + + def checkTest(self, **kwargs): + self.lyr.writeToLayer(self.layer) + + ms = self._MapSettings # class settings + settings_type = 'Class' + if self._TestMapSettings is not None: + ms = self._TestMapSettings # per test settings + settings_type = 'Test' + if 'PAL_VERBOSE' in os.environ: + qDebug('MapSettings type: {0}'.format(settings_type)) + qDebug(mapSettingsString(ms)) + + img = renderMapToImage(ms, parallel=False) + self._TestImage = getTempfilePath('png') + if not img.save(self._TestImage, 'png'): + os.unlink(self._TestImage) + raise OSError('Failed to save output from map render job') + self.saveControlImage(self._TestImage) + + mismatch = 0 + if 'PAL_NO_MISMATCH' not in os.environ: + # some mismatch expected + mismatch = self._Mismatch if self._Mismatch else 0 + if self._TestGroup in self._Mismatches: + mismatch = self._Mismatches[self._TestGroup] + colortol = 0 + if 'PAL_NO_COLORTOL' not in os.environ: + colortol = self._ColorTol if self._ColorTol else 0 + if self._TestGroup in self._ColorTols: + colortol = self._ColorTols[self._TestGroup] + self.assertTrue(*self.renderCheck(mismatch=mismatch, + colortol=colortol, + imgpath=self._TestImage)) + +# noinspection PyPep8Naming + + +class TestPointPlacement(TestPlacementBase): + + @classmethod + def setUpClass(cls): + TestPlacementBase.setUpClass() + cls.layer = None + + def test_point_placement_around(self): + # Default point label placement + self.layer = TestQgsPalLabeling.loadFeatureLayer('point') + self._TestMapSettings = self.cloneMapSettings(self._MapSettings) + self.checkTest() + self.removeMapLayer(self.layer) + self.layer = None + + def test_point_placement_around_obstacle(self): + # Default point label placement with obstacle + self.layer = TestQgsPalLabeling.loadFeatureLayer('point2') + self._TestMapSettings = self.cloneMapSettings(self._MapSettings) + self.checkTest() + self.removeMapLayer(self.layer) + self.layer = None + +if __name__ == '__main__': + # NOTE: unless PAL_SUITE env var is set all test class methods will be run + # SEE: test_qgspallabeling_tests.suiteTests() to define suite + suite = ('TestPointPlacement') + res = runSuite(sys.modules[__name__], suite) + sys.exit(not res.wasSuccessful()) diff --git a/tests/testdata/control_images/expected_pal_placement/sp_point_placement_around/sp_point_placement_around.png b/tests/testdata/control_images/expected_pal_placement/sp_point_placement_around/sp_point_placement_around.png new file mode 100644 index 0000000000000000000000000000000000000000..af9872b30837bcd2e0ea7cc93499c290026ff622 GIT binary patch literal 1487 zcmeAS@N?(olHy`uVBq!ia0y~yU|a&k5*%zm5n-1mYaqo^?Bp530R%N1DIGvQXMsm# zF#`j)5C}6~x?A^$fq}Kq)5S5QV$R!JhS_sdW!fM9U&-1m(bDDBDOwmX=g3m7uG!7^ z7qEt_o3kIx7Z99dZSnerj@~Yd9o8O8r)F$5lUj4_l7?EIY)p&Fm%aTl*UR|y`S-tl zR(mcocGsSI3x*9Fg1z|}8YCT=6r3h7cnGL42(fTBumHJ^qg=%csp_%zppn z5_3YVtjr(V+v0IE_P*ag_qP1~dH3yp7sgdTo;x#A*OvF%By$yuMdkYYESAgNoBRBJ zO_AAlvoy23bL#Rr`nKHHrYRg0eDf}5X8gY0R?p+=p1dnhpLcK0Z1cKV_H}oo3nbU* zhnE$wtiGDX$H(`+uI|C}-kqi2&dJ!78`#_YxSDfk|IP0A literal 0 HcmV?d00001 diff --git a/tests/testdata/control_images/expected_pal_placement/sp_point_placement_around/sp_point_placement_around_mask.png b/tests/testdata/control_images/expected_pal_placement/sp_point_placement_around/sp_point_placement_around_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..70cf8d8070d3e7839b1a11e20b44258898ed14fd GIT binary patch literal 1231 zcmeAS@N?(olHy`uVBq!ia0y~yU|a&k5*%zm5n-1mYaqo^?Bp530R%N1DIGvQXMsm# zF#`j4CkQi|pFF)5sHV`<#WAE}&fA-gxknrXTo0Cs7_lV@bYE5ZmS(}%e&Uo(?ka{Y z|K4Vr+&*)MnW4LOtsDb`aTAL}ivr^W1rG)l4j~3kAh&6hOZ(8czncAky2bh8uPhOd zEc%Y;VR(DyBaxzyG$qUTRzBKY`)L)Y|*aQFOADjlx2?OQzQG2naxH^Ul?}W5h_c-qYmPibqu6{1-oD!M)5S5QV$R#U`@8S6%O3yu{dq{xgpPTcS(ZYR!gP?j4z+zuY|>e146)w#m+2+MQ;g#Iep)RkNJ;TDR?*Ue%Rfs{PU~zO4H4 z+2(Ua&-{mnv#aas4yNxc`g`vo!+}%VuE{Yl7&oyvv?wr6Q1D<-;Sgfr1ag~3xdRs( z2VUj9zc*w5+q*HIt+y*pPuJU9l>0Pw&B0WT4PCc)n?Jj| zclP&W6XW84(dp0Un%|$%9KBmxFIl&VWld7#w3|8qelwokq@%rNp~HlR&^eanh3Dcb zYQC*|ci(>7@7sSXpKMf5tA75c>vTkSxyOMlK7RAho5knNEWcNiJS}ymyIggW-rirk zx2A6ta%2koKEK@UU5{Lj-EX!qb(b?0?WifuE~_E=!{@pA>unjsJ|2!e4+aD>-f01YOy&HO)TyO z)!&cp*+9<6%Aa|EzIi@>{SF>KJ;x^Hs+U{upT9PD?$5{id1vNE zm#4peC;rS@|6j)2$bzJwr}+9ZBDX!eq<#I_gKO{h{Mjo0Z07o!`nR41i+~R9&jdz9 z&9f^jx27NHR3|6*{%dDB{@^12{5gAr>!YgKY8J`;{ctkb_I}aRUwaQH+bT22G`g3K hmI_0+P&~As@yOI^#~yI@6A22WQ%mvv4FO#qXcCp7>7 literal 0 HcmV?d00001 diff --git a/tests/testdata/control_images/expected_pal_placement/sp_point_placement_around_obstacle/sp_point_placement_around_obstacle_mask.png b/tests/testdata/control_images/expected_pal_placement/sp_point_placement_around_obstacle/sp_point_placement_around_obstacle_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..d5becc24c27b180b9ee20867faf322e2bb6a0a5a GIT binary patch literal 1389 zcmeAS@N?(olHy`uVBq!ia0y~yU|a&k5*%zm5n-1mYaqo^?Bp530R%N1DIGvQXMsm# zF#`j4CkQi|pFF*mfq|9Z)5S5QV$R#U8@*m9Ftk0~|J5VB^_3C}i}?HhNii&}f(!Lz zSr^)hKM3QlR6cK<#&KWh-k-=#Qpqyx3}#O+5Tt()l^hh zOP80I+pmj{kMI9mXMb2J!p^Ztc<;V_eeLb-KsOw#+AFtx`}XARw_!H6A5OHfx9@*j zX04~Mf0U!{<^4O%2`}&6zyEw5Lw%F55Cdlui$jwF;{*i{1{DrsxQDWO9@?K_ICGA3 gGy@Fr{Qr-+V5)=1_ZWFmV0p>l>FVdQ&MBb@01-k%R{#J2 literal 0 HcmV?d00001 diff --git a/tests/testdata/labeling/pal_features_v3.sqlite b/tests/testdata/labeling/pal_features_v3.sqlite index 3fdc3f0be61c42a57a9344a0b1f721388616c7be..479a42eb5c5f75c0baa282e3818253c5f761ca95 100644 GIT binary patch delta 5311 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 diff --git a/tests/testdata/labeling/point2.qml b/tests/testdata/labeling/point2.qml new file mode 100644 index 000000000000..86fe385e0725 --- /dev/null +++ b/tests/testdata/labeling/point2.qml @@ -0,0 +1,339 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + pkuid + + + + + + + + + + + + 0 + + generatedlayout + + + +