QGIS API Documentation 3.34.0-Prizren (ffbdd678812)
Loading...
Searching...
No Matches
qgsrenderchecker.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsrenderchecker.h - check maprender output against an expected image
3 --------------------------------------
4 Date : 18 Jan 2008
5 Copyright : (C) 2008 by Tim Sutton
6 email : tim @ linfiniti.com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#ifndef QGSRENDERCHECKER_H
17#define QGSRENDERCHECKER_H
18
19#include "qgis_core.h"
20#include "qgis_sip.h"
21
22#include "qgslogger.h"
23#include "qgsmapsettings.h"
24#include "qgsdartmeasurement.h"
25
26#include <QDir>
27#include <QString>
28#include <QRegularExpression>
29#include <QList>
30
31class QImage;
32
33#define DUMP_BASE64_IMAGES 0
34
41class CORE_EXPORT QgsRenderChecker
42{
43 Q_GADGET
44
45 public:
46
51
57 static QDir testReportDir();
58
65 static bool shouldGenerateReport();
66
74 QString controlImagePath() const;
75
82 void setControlImagePath( const QString &path );
83
92 QString report( bool ignoreSuccess = true ) const;
93
103 QString markdownReport( bool ignoreSuccess = true ) const;
104
108 float matchPercent() const
109 {
110 return static_cast<float>( mMismatchCount ) /
111 static_cast<float>( mMatchTarget ) * 100;
112 }
113
117 unsigned int mismatchCount() const { return mMismatchCount; }
118
122 unsigned int matchTarget() const { return mMatchTarget; }
123
129 int elapsedTime() const { return mElapsedTime; }
130 void setElapsedTimeTarget( int target ) { mElapsedTimeTarget = target; }
131
139 void setControlName( const QString &name );
140
145 void setControlExtension( const QString &extension ) { mControlExtension = extension; }
146
151 void setControlPathPrefix( const QString &name ) { mControlPathPrefix = name + '/'; }
152
153 void setControlPathSuffix( const QString &name );
154
156 QString imageToHash( const QString &imageFile );
157
161 void setRenderedImage( const QString &imageFileName ) { mRenderedImageFile = imageFileName; }
162
168 void setExpectFail( bool expectFail ) { mExpectFail = expectFail; }
169
175 QString renderedImage() const { return mRenderedImageFile; }
176
178 void setMapSettings( const QgsMapSettings &mapSettings );
179
187 void setColorTolerance( unsigned int colorTolerance ) { mColorTolerance = colorTolerance; }
188
195 void setSizeTolerance( int xTolerance, int yTolerance ) { mMaxSizeDifferenceX = xTolerance; mMaxSizeDifferenceY = yTolerance; }
196
202 enum class Flag : int
203 {
204 AvoidExportingRenderedImage = 1 << 0,
205 };
206 Q_ENUM( Flag )
207
208
213 Q_DECLARE_FLAGS( Flags, Flag )
214 Q_FLAG( Flags )
215
216
227 bool runTest( const QString &testName, unsigned int mismatchCount = 0, QgsRenderChecker::Flags flags = QgsRenderChecker::Flags() );
228
241 bool compareImages( const QString &testName, unsigned int mismatchCount = 0, const QString &renderedImageFile = QString(), QgsRenderChecker::Flags flags = QgsRenderChecker::Flags() );
242
248 bool compareImages( const QString &testName, const QString &referenceImageFile, const QString &renderedImageFile, unsigned int mismatchCount = 0, QgsRenderChecker::Flags flags = QgsRenderChecker::Flags() );
249
260 Q_DECL_DEPRECATED bool isKnownAnomaly( const QString &diffImageFile ) SIP_DEPRECATED;
261
266 static void drawBackground( QImage *image );
267
273 QString expectedImageFile() const { return mExpectedImageFile; }
274
282 void enableDashBuffering( bool enable ) { mBufferDashMessages = enable; }
283
290 QVector<QgsDartMeasurement> dartMeasurements() const { return mDashMessages; }
291
292 protected:
294 QString mReport;
297 unsigned int mMatchTarget = 0;
298 int mElapsedTime = 0;
301
302 private:
303 void emitDashMessage( const QgsDartMeasurement &dashMessage );
304 void emitDashMessage( const QString &name, QgsDartMeasurement::Type type, const QString &value );
305
306#if DUMP_BASE64_IMAGES
307 void dumpRenderedImageAsBase64();
308#endif
309
310 void performPostTestActions( Flags flags );
311
312 bool mResult = false;
313 bool mExpectFail = false;
314
315 QString mBasePath;
316
317 QString mControlName;
318 unsigned int mMismatchCount = 0;
319 unsigned int mColorTolerance = 0;
320 int mMaxSizeDifferenceX = 0;
321 int mMaxSizeDifferenceY = 0;
322 int mElapsedTimeTarget = 0;
323 QgsMapSettings mMapSettings;
324 QString mControlExtension = QStringLiteral( "png" );
325 QString mControlPathPrefix;
326 QString mControlPathSuffix;
327 bool mIsCiRun = false;
328 QVector<QgsDartMeasurement> mDashMessages;
329 bool mBufferDashMessages = false;
330 QString mDiffImageFile;
331
333};
334
335Q_DECLARE_OPERATORS_FOR_FLAGS( QgsRenderChecker::Flags )
336
337
345inline bool compareWkt( const QString &a, const QString &b, double tolerance = 0.000001 )
346{
347 QgsDebugMsgLevel( QStringLiteral( "a:%1 b:%2 tol:%3" ).arg( a, b ).arg( tolerance ), 2 );
348 const thread_local QRegularExpression re( "-?\\d+(?:\\.\\d+)?(?:[eE]\\d+)?" );
349
350 QString a0( a ), b0( b );
351 a0.replace( re, QStringLiteral( "#" ) );
352 b0.replace( re, QStringLiteral( "#" ) );
353
354 QgsDebugMsgLevel( QStringLiteral( "a0:%1 b0:%2" ).arg( a0, b0 ), 2 );
355
356 if ( a0 != b0 )
357 return false;
358
359 QList<double> al, bl;
360
361 int pos = 0;
362 QRegularExpressionMatch match = re.match( a );
363 while ( match.hasMatch() )
364 {
365 al << match.captured( 0 ).toDouble();
366 pos = match.capturedStart( 0 ) + match.capturedLength( 0 );
367 match = re.match( a, pos );
368 }
369 match = re.match( b );
370 while ( match.hasMatch() )
371 {
372 bl << match.captured( 0 ).toDouble();
373 pos = match.capturedStart( 0 ) + match.capturedLength( 0 );
374 match = re.match( b, pos );
375 }
376
377 if ( al.size() != bl.size() )
378 return false;
379
380 for ( int i = 0; i < al.size(); i++ )
381 {
382 if ( !qgsDoubleNear( al[i], bl[i], tolerance ) )
383 return false;
384 }
385
386 return true;
387}
388
389#endif
The QgsMapSettings class contains configuration for rendering of the map.
This class allows checking rendered images against comparison images.
This is a helper class for unit tests that need to write an image and compare it to an expected resul...
void setControlExtension(const QString &extension)
Sets file extension for the control image.
float matchPercent() const
Returns the percent of pixels which matched the control image.
unsigned int matchTarget() const
Returns the total number of pixels in the control image.
QString mReport
HTML format report.
Flag
Render checker flags.
int elapsedTime() const
Returns the total elapsed time for the rendering test.
QString mMarkdownReport
Markdown report.
QString renderedImage() const
Returns the path of the rendered image generated by the test.
void setElapsedTimeTarget(int target)
QVector< QgsDartMeasurement > dartMeasurements() const
Gets access to buffered dash messages.
void setControlPathPrefix(const QString &name)
Sets the path prefix where the control images are kept.
void setRenderedImage(const QString &imageFileName)
Sets the file name of the rendered image generated by the test.
void setSizeTolerance(int xTolerance, int yTolerance)
Sets the largest allowable difference in size between the rendered and the expected image.
void enableDashBuffering(bool enable)
Call this to enable internal buffering of dash messages.
unsigned int mismatchCount() const
Returns the number of pixels which did not match the control image.
void setExpectFail(bool expectFail)
Sets whether the comparison is expected to fail.
void setColorTolerance(unsigned int colorTolerance)
Set tolerance for color components used by runTest() and compareImages().
QString expectedImageFile() const
Returns the path to the expected image file.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Definition qgis.h:4332
#define SIP_DEPRECATED
Definition qgis_sip.h:106
#define QgsDebugMsgLevel(str, level)
Definition qgslogger.h:39
bool compareWkt(const QString &a, const QString &b, double tolerance=0.000001)
Compare two WKT strings with some tolerance.
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsTextRendererUtils::CurvedTextFlags)