Skip to content

Commit 6aed6fe

Browse files
committedDec 28, 2013
[tests] Fix python compositionchecker to derive from render checker, fix most python composer tests (fix #9117)
1 parent 2e107f2 commit 6aed6fe

13 files changed

+126
-230
lines changed
 

‎python/core/qgsrenderchecker.sip

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,7 @@ class QgsRenderChecker
3838
bool compareImages( QString theTestName, unsigned int theMismatchCount = 0, QString theRenderedImageFile = "" );
3939

4040
bool isKnownAnomaly( QString theDiffImageFile );
41+
42+
QString expectedImageFile();
43+
4144
};

‎python/core/qgsvectorlayer.sip

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -920,6 +920,29 @@ class QgsVectorLayer : QgsMapLayer
920920
* @note added in 2.0
921921
*/
922922
int layerTransparency() const;
923+
924+
/** Set the Map2pixel simplification threshold for fast rendering of features */
925+
void setSimplifyDrawingTol( float simplifyDrawingTol );
926+
/** Returns the Map2pixel simplification threshold for fast rendering of features */
927+
float simplifyDrawingTol() const;
928+
929+
/** Simplification flags for fast rendering of features */
930+
enum SimplifyHint
931+
{
932+
NoSimplification = 0, //!< No simplification can be applied
933+
GeometrySimplification = 1, //!< The geometries can be simplified using the current map2pixel context state
934+
EnvelopeSimplification = 2, //!< The geometries can be fully simplified by its BoundingBox using the current map2pixel context state
935+
AntialiasingSimplification = 4, //!< The geometries can be rendered with 'AntiAliasing' disabled because of it is '1-pixel size'
936+
DefaultSimplification = 3, //!< Default simplification hints can be applied ( Geometry + Envelope )
937+
FullSimplification = 7, //!< All simplification hints can be applied ( Geometry + Envelope + AA-disabling )
938+
};
939+
/** Set the Map2pixel simplification hints for fast rendering of features */
940+
void setSimplifyDrawingHints( int simplifyDrawingHints );
941+
/** Returns the Map2pixel simplification hints for fast rendering of features */
942+
int simplifyDrawingHints() const;
943+
944+
/** Returns whether the VectorLayer can apply the specified simplification hint */
945+
bool simplifyDrawingCanbeApplied( int simplifyHint ) const;
923946

924947
public slots:
925948
/**

‎src/core/qgsrenderchecker.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ class CORE_EXPORT QgsRenderChecker
101101
*/
102102
bool isKnownAnomaly( QString theDiffImageFile );
103103

104+
QString expectedImageFile() { return mExpectedImageFile; };
105+
104106
protected:
105107

106108
QString mReport;

‎tests/src/core/qgscompositionchecker.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,11 @@
2121
#include <QImage>
2222
#include <QPainter>
2323

24-
QgsCompositionChecker::QgsCompositionChecker( const QString& testName, QgsComposition* composition, const QString& expectedImageFile )
24+
QgsCompositionChecker::QgsCompositionChecker( const QString& testName, QgsComposition* composition )
2525
: QgsRenderChecker( ),
2626
mTestName( testName ),
2727
mComposition( composition )
2828
{
29-
Q_UNUSED( expectedImageFile );
3029
}
3130

3231
QgsCompositionChecker::QgsCompositionChecker()
@@ -37,12 +36,6 @@ QgsCompositionChecker::~QgsCompositionChecker()
3736
{
3837
}
3938

40-
bool QgsCompositionChecker::testComposition( int page )
41-
{
42-
QString fake;
43-
return testComposition( fake, page );
44-
}
45-
4639
bool QgsCompositionChecker::testComposition( QString &report, int page )
4740
{
4841
if ( !mComposition )

‎tests/src/core/qgscompositionchecker.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,10 @@ class QImage;
2626
class QgsCompositionChecker : public QgsRenderChecker
2727
{
2828
public:
29-
QgsCompositionChecker( const QString& testName, QgsComposition* composition, const QString& expectedImageFile = QString() );
29+
QgsCompositionChecker( const QString& testName, QgsComposition* composition );
3030
~QgsCompositionChecker();
3131

3232
bool testComposition( QString &report, int page = 0 );
33-
bool testComposition( int page = 0 );
3433

3534
private:
3635
QgsCompositionChecker(); //forbidden

‎tests/src/python/qgscompositionchecker.py

Lines changed: 20 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -20,35 +20,40 @@
2020
from PyQt4.QtGui import *
2121
from qgis.core import *
2222

23-
class QgsCompositionChecker:
24-
25-
def testComposition(self, mTestName, mComposition, mExpectedImageFile, page=0 ):
26-
if ( mComposition == None):
23+
class QgsCompositionChecker(QgsRenderChecker):
24+
def __init__(self, mTestName, mComposition ):
25+
self.mExpectedImageFile = ""
26+
self.mComposition = mComposition
27+
self.mTestName = mTestName
28+
super(QgsCompositionChecker, self).__init__()
29+
30+
def testComposition(self, page=0 ):
31+
if ( self.mComposition == None):
2732
myMessage = "Composition not valid"
2833
return False, myMessage
2934

30-
3135
#load expected image
32-
expectedImage = QImage( mExpectedImageFile )
36+
self.setControlName("expected_"+self.mTestName);
37+
expectedImage = QImage( self.expectedImageFile() )
3338

3439
#get width/height, create image and render the composition to it
3540
width = expectedImage.width();
3641
height = expectedImage.height();
3742
outputImage = QImage( QSize( width, height ), QImage.Format_ARGB32 )
3843

39-
mComposition.setPlotStyle( QgsComposition.Print )
44+
self.mComposition.setPlotStyle( QgsComposition.Print )
4045
outputImage.setDotsPerMeterX( expectedImage.dotsPerMeterX() )
4146
outputImage.setDotsPerMeterY( expectedImage.dotsPerMeterX() )
4247
outputImage.fill( 0 )
4348
p = QPainter( outputImage )
44-
mComposition.renderPage( p, page )
49+
self.mComposition.renderPage( p, page )
4550
p.end()
4651

47-
renderedFilePath = QDir.tempPath() + QDir.separator() + QFileInfo( mExpectedImageFile ).baseName() + "_rendered_python.png"
52+
renderedFilePath = QDir.tempPath() + QDir.separator() + QFileInfo(self.mTestName).baseName() + "_rendered.png"
4853
outputImage.save( renderedFilePath, "PNG" )
4954

50-
diffFilePath = QDir.tempPath() + QDir.separator() + QFileInfo( mExpectedImageFile ).baseName() + "_diff_python.png"
51-
testResult = self.compareImages( expectedImage, outputImage, diffFilePath )
55+
diffFilePath = QDir.tempPath() + QDir.separator() + QFileInfo(self.mTestName).baseName() + "_result_diff.png"
56+
testResult = self.compareImages( self.mTestName, 0, renderedFilePath )
5257

5358
myDashMessage = (('<DartMeasurementFile name="Rendered Image '
5459
'%s" type="image/png">'
@@ -59,44 +64,15 @@ def testComposition(self, mTestName, mComposition, mExpectedImageFile, page=0
5964
'<DartMeasurementFile name="Difference Image '
6065
'%s" type="image/png">'
6166
'%s</DartMeasurementFile>') %
62-
(mTestName, renderedFilePath, mTestName,
63-
mExpectedImageFile, mTestName, diffFilePath )
67+
(self.mTestName, renderedFilePath, self.mTestName,
68+
self.expectedImageFile(), self.mTestName, diffFilePath )
6469
)
6570
qDebug( myDashMessage )
6671
if not testResult:
6772
myMessage = ('Expected: %s\nGot: %s\nDifference: %s\n' %
68-
(mExpectedImageFile, renderedFilePath, diffFilePath))
73+
(self.expectedImageFile(), renderedFilePath, diffFilePath))
6974
else:
7075
myMessage = 'Control and test images matched.'
71-
return testResult, myMessage
72-
73-
def compareImages( self, imgExpected, imgRendered, differenceImagePath ):
74-
75-
if ( imgExpected.width() != imgRendered.width()
76-
or imgExpected.height() != imgRendered.height() ):
77-
return False
7876

79-
imageWidth = imgExpected.width()
80-
imageHeight = imgExpected.height()
81-
mismatchCount = 0
82-
83-
differenceImage = QImage(
84-
imageWidth, imageHeight, QImage.Format_ARGB32_Premultiplied )
85-
differenceImage.fill( qRgb( 152, 219, 249 ) )
86-
87-
pixel1 = QColor().rgb()
88-
pixel2 = QColor().rgb()
89-
for i in range( imageHeight ):
90-
for j in range( imageWidth ):
91-
pixel1 = imgExpected.pixel( j, i )
92-
pixel2 = imgRendered.pixel( j, i )
93-
if ( pixel1 != pixel2 ):
94-
mismatchCount = mismatchCount + 1
95-
differenceImage.setPixel( j, i, qRgb( 255, 0, 0 ) )
96-
97-
if differenceImagePath != "":
98-
differenceImage.save( differenceImagePath, "PNG" )
77+
return testResult, myMessage
9978

100-
#allow pixel deviation of 1 percent
101-
pixelCount = imageWidth * imageHeight;
102-
return (float(mismatchCount) / float(pixelCount) ) < 0.01

‎tests/src/python/test_qgsatlascomposition.py

Lines changed: 20 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,10 @@ def autoscale_render_test( self ):
121121
self.mAtlas.prepareForFeature( i )
122122
self.mLabel1.adjustSizeToText()
123123

124-
checker = QgsCompositionChecker()
125-
res = checker.testComposition( "Atlas autoscale test", self.mComposition, \
126-
self.TEST_DATA_DIR + QDir.separator() + \
127-
"control_images" + QDir.separator() + \
128-
"expected_composermapatlas" + QDir.separator() + \
129-
"autoscale_%d.png" % i )
130-
assert res[0] == True
124+
checker = QgsCompositionChecker('atlas_autoscale%d' % (i + 1), self.mComposition)
125+
myTestResult, myMessage = checker.testComposition()
126+
127+
assert myTestResult == True
131128
self.mAtlas.endRender()
132129

133130
def fixedscale_render_test( self ):
@@ -140,13 +137,10 @@ def fixedscale_render_test( self ):
140137
self.mAtlas.prepareForFeature( i )
141138
self.mLabel1.adjustSizeToText()
142139

143-
checker = QgsCompositionChecker()
144-
res = checker.testComposition( "Atlas fixed scale test", self.mComposition, \
145-
self.TEST_DATA_DIR + QDir.separator() + \
146-
"control_images" + QDir.separator() + \
147-
"expected_composermapatlas" + QDir.separator() + \
148-
"fixedscale_%d.png" % i )
149-
assert res[0] == True
140+
checker = QgsCompositionChecker('atlas_fixedscale%d' % (i + 1), self.mComposition)
141+
myTestResult, myMessage = checker.testComposition()
142+
143+
assert myTestResult == True
150144
self.mAtlas.endRender()
151145

152146
def hidden_render_test( self ):
@@ -160,13 +154,10 @@ def hidden_render_test( self ):
160154
self.mAtlas.prepareForFeature( i )
161155
self.mLabel1.adjustSizeToText()
162156

163-
checker = QgsCompositionChecker()
164-
res = checker.testComposition( "Atlas hidden test", self.mComposition, \
165-
self.TEST_DATA_DIR + QDir.separator() + \
166-
"control_images" + QDir.separator() + \
167-
"expected_composermapatlas" + QDir.separator() + \
168-
"hiding_%d.png" % i )
169-
assert res[0] == True
157+
checker = QgsCompositionChecker('atlas_hiding%d' % (i + 1), self.mComposition)
158+
myTestResult, myMessage = checker.testComposition()
159+
160+
assert myTestResult == True
170161
self.mAtlas.endRender()
171162

172163
def sorting_render_test( self ):
@@ -184,13 +175,10 @@ def sorting_render_test( self ):
184175
self.mAtlas.prepareForFeature( i )
185176
self.mLabel1.adjustSizeToText()
186177

187-
checker = QgsCompositionChecker()
188-
res = checker.testComposition( "Atlas sorting test", self.mComposition, \
189-
self.TEST_DATA_DIR + QDir.separator() + \
190-
"control_images" + QDir.separator() + \
191-
"expected_composermapatlas" + QDir.separator() + \
192-
"sorting_%d.png" % i )
193-
assert res[0] == True
178+
checker = QgsCompositionChecker('atlas_sorting%d' % (i + 1), self.mComposition)
179+
myTestResult, myMessage = checker.testComposition()
180+
181+
assert myTestResult == True
194182
self.mAtlas.endRender()
195183

196184
def filtering_render_test( self ):
@@ -209,13 +197,10 @@ def filtering_render_test( self ):
209197
self.mAtlas.prepareForFeature( i )
210198
self.mLabel1.adjustSizeToText()
211199

212-
checker = QgsCompositionChecker()
213-
res = checker.testComposition( "Atlas filtering test", self.mComposition, \
214-
self.TEST_DATA_DIR + QDir.separator() + \
215-
"control_images" + QDir.separator() + \
216-
"expected_composermapatlas" + QDir.separator() + \
217-
"filtering_%d.png" % i )
218-
assert res[0] == True
200+
checker = QgsCompositionChecker('atlas_filtering%d' % (i + 1), self.mComposition)
201+
myTestResult, myMessage = checker.testComposition()
202+
203+
assert myTestResult == True
219204
self.mAtlas.endRender()
220205

221206
if __name__ == '__main__':

‎tests/src/python/test_qgsblendmodes.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,13 @@ def __init__(self, methodName):
6666
# create polygon layer
6767
myShpFile = os.path.join(TEST_DATA_DIR, 'polys.shp')
6868
self.mPolygonLayer = QgsVectorLayer(myShpFile, 'Polygons', 'ogr')
69+
self.mPolygonLayer.setSimplifyDrawingHints(QgsVectorLayer.NoSimplification)
6970
self.mMapRegistry.addMapLayer(self.mPolygonLayer)
7071

7172
# create line layer
7273
myShpFile = os.path.join(TEST_DATA_DIR, 'lines.shp')
7374
self.mLineLayer = QgsVectorLayer(myShpFile, 'Lines', 'ogr')
75+
self.mLineLayer.setSimplifyDrawingHints(QgsVectorLayer.NoSimplification)
7476
self.mMapRegistry.addMapLayer(self.mLineLayer)
7577

7678
# create two raster layers

‎tests/src/python/test_qgscomposereffects.py

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,9 @@ def testBlendModes(self):
6161

6262
self.mComposerRect2.setBlendMode(QPainter.CompositionMode_Multiply)
6363

64-
checker = QgsCompositionChecker()
65-
myPath = os.path.join(TEST_DATA_DIR,
66-
'control_images',
67-
'expected_composereffects',
68-
'composereffect_blend.png')
69-
myTestResult, myMessage = checker.testComposition('Composer effects blending',
70-
self.mComposition, myPath)
64+
checker = QgsCompositionChecker('composereffects_blend', self.mComposition)
65+
myTestResult, myMessage = checker.testComposition()
66+
7167
self.mComposerRect2.setBlendMode(QPainter.CompositionMode_SourceOver)
7268

7369
assert myTestResult == True, myMessage
@@ -77,13 +73,9 @@ def testTransparency(self):
7773

7874
self.mComposerRect2.setTransparency( 50 )
7975

80-
checker = QgsCompositionChecker()
81-
myPath = os.path.join(TEST_DATA_DIR,
82-
'control_images',
83-
'expected_composereffects',
84-
'composereffect_transparency.png')
85-
myTestResult, myMessage = checker.testComposition('Composer effects transparency',
86-
self.mComposition, myPath)
76+
checker = QgsCompositionChecker('composereffects_transparency', self.mComposition)
77+
myTestResult, myMessage = checker.testComposition()
78+
8779
self.mComposerRect2.setTransparency( 100 )
8880

8981
assert myTestResult == True, myMessage

0 commit comments

Comments
 (0)
Please sign in to comment.