From 712b3e72c6cdd46c122c47e8380d5acc95643498 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Mon, 21 Oct 2024 09:54:26 +1000 Subject: [PATCH] QgsMultiRenderChecker: avoid misleading console output noise When the checker passes comparison against ANY reference image, don't output mismatch failure message for all the other variants --- .../core/auto_additions/qgsrenderchecker.py | 5 ++++ .../auto_generated/qgsrenderchecker.sip.in | 1 + .../core/auto_additions/qgsrenderchecker.py | 5 ++++ .../auto_generated/qgsrenderchecker.sip.in | 1 + src/core/qgsmultirenderchecker.cpp | 29 ++++++++++++++----- src/core/qgsrenderchecker.cpp | 14 +++++++-- src/core/qgsrenderchecker.h | 1 + 7 files changed, 46 insertions(+), 10 deletions(-) diff --git a/python/PyQt6/core/auto_additions/qgsrenderchecker.py b/python/PyQt6/core/auto_additions/qgsrenderchecker.py index f797e96ce7d..9a43668bc84 100644 --- a/python/PyQt6/core/auto_additions/qgsrenderchecker.py +++ b/python/PyQt6/core/auto_additions/qgsrenderchecker.py @@ -1,11 +1,16 @@ # The following has been generated automatically from src/core/qgsrenderchecker.h # monkey patching scoped based enum QgsRenderChecker.Flag.AvoidExportingRenderedImage.__doc__ = "Avoids exporting rendered images to reports" +QgsRenderChecker.Flag.Silent.__doc__ = "Don't output non-critical messages to console \n.. versionadded:: 3.40" QgsRenderChecker.Flag.__doc__ = """Render checker flags. .. versionadded:: 3.28 * ``AvoidExportingRenderedImage``: Avoids exporting rendered images to reports +* ``Silent``: Don't output non-critical messages to console + + .. versionadded:: 3.40 + """ # -- diff --git a/python/PyQt6/core/auto_generated/qgsrenderchecker.sip.in b/python/PyQt6/core/auto_generated/qgsrenderchecker.sip.in index e854c08109f..6306aa0c441 100644 --- a/python/PyQt6/core/auto_generated/qgsrenderchecker.sip.in +++ b/python/PyQt6/core/auto_generated/qgsrenderchecker.sip.in @@ -183,6 +183,7 @@ Sets the largest allowable difference in size between the rendered and the expec enum class Flag /BaseType=IntFlag/ { AvoidExportingRenderedImage, + Silent, }; typedef QFlags Flags; diff --git a/python/core/auto_additions/qgsrenderchecker.py b/python/core/auto_additions/qgsrenderchecker.py index 0bb885f095a..ba68598300c 100644 --- a/python/core/auto_additions/qgsrenderchecker.py +++ b/python/core/auto_additions/qgsrenderchecker.py @@ -1,11 +1,16 @@ # The following has been generated automatically from src/core/qgsrenderchecker.h # monkey patching scoped based enum QgsRenderChecker.Flag.AvoidExportingRenderedImage.__doc__ = "Avoids exporting rendered images to reports" +QgsRenderChecker.Flag.Silent.__doc__ = "Don't output non-critical messages to console \n.. versionadded:: 3.40" QgsRenderChecker.Flag.__doc__ = """Render checker flags. .. versionadded:: 3.28 * ``AvoidExportingRenderedImage``: Avoids exporting rendered images to reports +* ``Silent``: Don't output non-critical messages to console + + .. versionadded:: 3.40 + """ # -- diff --git a/python/core/auto_generated/qgsrenderchecker.sip.in b/python/core/auto_generated/qgsrenderchecker.sip.in index 67e6c82e541..068cf934c6a 100644 --- a/python/core/auto_generated/qgsrenderchecker.sip.in +++ b/python/core/auto_generated/qgsrenderchecker.sip.in @@ -183,6 +183,7 @@ Sets the largest allowable difference in size between the rendered and the expec enum class Flag { AvoidExportingRenderedImage, + Silent, }; typedef QFlags Flags; diff --git a/src/core/qgsmultirenderchecker.cpp b/src/core/qgsmultirenderchecker.cpp index 7dbab9950cf..b446bc90ec6 100644 --- a/src/core/qgsmultirenderchecker.cpp +++ b/src/core/qgsmultirenderchecker.cpp @@ -78,13 +78,11 @@ bool QgsMultiRenderChecker::runTest( const QString &testName, unsigned int misma // we can only report one diff image, so just use the first QString diffImageFile; + QMap< QString, int > variantMismatchCount; + QMap< QString, int > variantSize; + for ( const QString &suffix : std::as_const( subDirs ) ) { - if ( subDirs.count() > 1 ) - { - qDebug() << "Checking subdir " << suffix; - } - bool result; QgsRenderChecker checker; checker.enableDashBuffering( true ); checker.setColorTolerance( mColorTolerance ); @@ -95,14 +93,15 @@ bool QgsMultiRenderChecker::runTest( const QString &testName, unsigned int misma checker.setMapSettings( mMapSettings ); checker.setExpectFail( mExpectFail ); + bool result = false; if ( !mRenderedImage.isNull() ) { checker.setRenderedImage( mRenderedImage ); - result = checker.compareImages( testName, mismatchCount, mRenderedImage, QgsRenderChecker::Flag::AvoidExportingRenderedImage ); + result = checker.compareImages( testName, mismatchCount, mRenderedImage, QgsRenderChecker::Flag::AvoidExportingRenderedImage | QgsRenderChecker::Flag::Silent ); } else { - result = checker.runTest( testName, mismatchCount, QgsRenderChecker::Flag::AvoidExportingRenderedImage ); + result = checker.runTest( testName, mismatchCount, QgsRenderChecker::Flag::AvoidExportingRenderedImage | QgsRenderChecker::Flag::Silent ); mRenderedImage = checker.renderedImage(); } @@ -120,6 +119,11 @@ bool QgsMultiRenderChecker::runTest( const QString &testName, unsigned int misma { diffImageFile = checker.mDiffImageFile; } + if ( !mResult ) + { + variantMismatchCount.insert( suffix, checker.mismatchCount() ); + variantSize.insert( suffix, checker.matchTarget() ); + } } if ( !mResult && !mExpectFail && mIsCiRun ) @@ -148,6 +152,17 @@ bool QgsMultiRenderChecker::runTest( const QString &testName, unsigned int misma if ( !mResult && !mExpectFail ) { + for ( auto it = variantMismatchCount.constBegin(); it != variantMismatchCount.constEnd(); it++ ) + { + if ( subDirs.size() > 1 ) + { + qDebug() << QStringLiteral( "Variant %1: %2/%3 pixels mismatched (%4 allowed)" ).arg( it.key() ).arg( it.value() ).arg( variantSize.value( it.key() ) ).arg( mismatchCount ); + } + else + { + qDebug() << QStringLiteral( "%1/%2 pixels mismatched (%4 allowed)" ).arg( it.value() ).arg( variantSize.value( it.key() ) ).arg( mismatchCount ); + } + } const QDir reportDir = QgsRenderChecker::testReportDir(); if ( !reportDir.exists() ) { diff --git a/src/core/qgsrenderchecker.cpp b/src/core/qgsrenderchecker.cpp index 503a12f9ce4..5d3457b118e 100644 --- a/src/core/qgsrenderchecker.cpp +++ b/src/core/qgsrenderchecker.cpp @@ -523,7 +523,9 @@ bool QgsRenderChecker::compareImages( const QString &testName, const QString &re // Put the same info to debug too // - if ( expectedImage.width() != myResultImage.width() || expectedImage.height() != myResultImage.height() ) + if ( !flags.testFlag( Flag::Silent ) + && ( expectedImage.width() != myResultImage.width() || expectedImage.height() != myResultImage.height() ) + ) { qDebug( "Expected size: %dw x %dh", expectedImage.width(), expectedImage.height() ); qDebug( "Actual size: %dw x %dh", myResultImage.width(), myResultImage.height() ); @@ -533,7 +535,10 @@ bool QgsRenderChecker::compareImages( const QString &testName, const QString &re if ( mMatchTarget != myPixelCount ) { - qDebug( "Expected image and rendered image for %s are different dimensions", testName.toLocal8Bit().constData() ); + if ( !flags.testFlag( Flag::Silent ) ) + { + qDebug( "Expected image and rendered image for %s are different dimensions", testName.toLocal8Bit().constData() ); + } if ( std::abs( expectedImage.width() - myResultImage.width() ) > mMaxSizeDifferenceX || std::abs( expectedImage.height() - myResultImage.height() ) > mMaxSizeDifferenceY ) @@ -690,7 +695,10 @@ bool QgsRenderChecker::compareImages( const QString &testName, const QString &re emitDashMessage( "Rendered Image " + testName + prefix, QgsDartMeasurement::ImagePng, mRenderedImageFile ); emitDashMessage( "Expected Image " + testName + prefix, QgsDartMeasurement::ImagePng, referenceImageFile ); - qDebug( "%d/%d pixels mismatched (%d allowed)", mMismatchCount, mMatchTarget, mismatchCount ); + if ( !flags.testFlag( Flag::Silent ) ) + { + qDebug( "%d/%d pixels mismatched (%d allowed)", mMismatchCount, mMatchTarget, mismatchCount ); + } // //save the diff image to disk diff --git a/src/core/qgsrenderchecker.h b/src/core/qgsrenderchecker.h index f411711d55f..83b3b783e9e 100644 --- a/src/core/qgsrenderchecker.h +++ b/src/core/qgsrenderchecker.h @@ -199,6 +199,7 @@ class CORE_EXPORT QgsRenderChecker enum class Flag : int SIP_ENUM_BASETYPE( IntFlag ) { AvoidExportingRenderedImage = 1 << 0, //!< Avoids exporting rendered images to reports + Silent = 1 << 1, //!< Don't output non-critical messages to console \since QGIS 3.40 }; Q_ENUM( Flag )