void GraphicTest::imageTest() { PhGraphicView view(64, 64); PhGraphicImage image("rgbPatternTest.expected.bmp"); connect(&view, &PhGraphicView::paint, [&](int w, int h) { image.setSize(w, h); image.draw(); }); view.show(); QImage resultImage(view.renderPixmap(64, 64).toImage()); QString resultFile = QString("%1.result.bmp").arg(QTest::currentTestFunction()); resultImage.save(resultFile); // The expected result should be the same than the input (rgbPatternTest.bmp) // but it turns out that image is altered when opened with IMG_Load() // (see PhGraphicImage::init()) QString expectedFile = QString("%1.expected.bmp").arg(QTest::currentTestFunction()); QImage expectedImage(expectedFile); unsigned int result = PhPictureTools::compare(resultImage, expectedImage); QVERIFY2(result == 0, PHNQ(QString("Comparison result=%1").arg(result))); }
void GraphicTest::rgbPatternTest() { int w = 64; int h = 64; PhGraphicView view(w, h); PhGraphicTexturedRect rect(0, 0, w, h); connect(&view, &PhGraphicView::paint, [&](int w, int h) { #warning /// @todo try to make it before (creating the texture on auto init) unsigned char * buffer = PhPictureTools::generateRGBPattern(w, h); rect.createTextureFromRGBBuffer(buffer, w, h); delete buffer; rect.draw(); }); view.show(); QImage resultImage(view.renderPixmap(64, 64).toImage()); QString resultFile = QString("%1.result.bmp").arg(QTest::currentTestFunction()); resultImage.save(resultFile); QString expectedFile = QString("%1.expected.bmp").arg(QTest::currentTestFunction()); QImage expectedImage(expectedFile); unsigned int result = PhPictureTools::compare(resultImage, expectedImage); QVERIFY2(result == 0, PHNQ(QString("Comparison result=%1").arg(result))); }
void GraphicTest::rectTest() { PhGraphicView view(32, 32); PhGraphicSolidRect rect; rect.setColor(Qt::red); connect(&view, &PhGraphicView::paint, [&](int w, int h) { rect.setSize(w / 2, h / 2); rect.draw(); }); view.show(); // Note: using view.grabFrameBuffer() causes timing issues. // There is no warranty that the scene has been fully rendered. // Use view.renderPixmap().toImage() instead. QImage resultImage(view.renderPixmap(32, 32).toImage()); QString resultFile = QString("%1.result.bmp").arg(QTest::currentTestFunction()); resultImage.save(resultFile); QString expectedFile = QString("%1.expected.bmp").arg(QTest::currentTestFunction()); QImage expectedImage(expectedFile); unsigned int result = PhPictureTools::compare(resultImage, expectedImage); QVERIFY2(result == 0, PHNQ(QString("Comparison result=%1").arg(result))); }
bool QgsCompositionChecker::testComposition( QString &report, int page ) { if ( !mComposition ) { return false; } #if 0 //fake mode to generate expected image //assume 300 dpi and size of the control image 3507 * 2480 QImage outputImage( QSize( 3507, 2480 ), QImage::Format_ARGB32 ); mComposition->setPlotStyle( QgsComposition::Print ); outputImage.setDotsPerMeterX( 300 / 25.4 * 1000 ); outputImage.setDotsPerMeterY( 300 / 25.4 * 1000 ); outputImage.fill( 0 ); QPainter p( &outputImage ); //QRectF sourceArea( 0, 0, mComposition->paperWidth(), mComposition->paperHeight() ); //QRectF targetArea( 0, 0, 3507, 2480 ); mComposition->renderPage( &p, page ); p.end(); outputImage.save( "/tmp/composerhtml_table_control.png", "PNG" ); return false; #endif //0 //load expected image setControlName( "expected_" + mTestName ); QImage expectedImage( mExpectedImageFile ); //get width/height, create image and render the composition to it int width = expectedImage.width(); int height = expectedImage.height(); QImage outputImage( QSize( width, height ), QImage::Format_ARGB32 ); mComposition->setPlotStyle( QgsComposition::Print ); outputImage.setDotsPerMeterX( expectedImage.dotsPerMeterX() ); outputImage.setDotsPerMeterY( expectedImage.dotsPerMeterX() ); outputImage.fill( 0 ); QPainter p( &outputImage ); mComposition->renderPage( &p, page ); p.end(); QString renderedFilePath = QDir::tempPath() + QDir::separator() + QFileInfo( mTestName ).baseName() + "_rendered.png"; outputImage.save( renderedFilePath, "PNG" ); QString diffFilePath = QDir::tempPath() + QDir::separator() + QFileInfo( mTestName ).baseName() + "_result_diff.png"; bool testResult = compareImages( mTestName, 0, renderedFilePath ); QString myDashMessage = "<DartMeasurementFile name=\"Rendered Image " + mTestName + "\"" " type=\"image/png\">" + renderedFilePath + "</DartMeasurementFile>" "<DartMeasurementFile name=\"Expected Image " + mTestName + "\" type=\"image/png\">" + mExpectedImageFile + "</DartMeasurementFile>" "<DartMeasurementFile name=\"Difference Image " + mTestName + "\" type=\"image/png\">" + diffFilePath + "</DartMeasurementFile>"; qDebug( ) << myDashMessage; report += mReport; return testResult; }
int TestCreator::compareImageLists() { _progressBar->setMinimum(0); _progressBar->setMaximum(_expectedImagesFullFilenames.length() - 1); _progressBar->setValue(0); _progressBar->setVisible(true); // Loop over both lists and compare each pair of images // Quit loop if user has aborted due to a failed test. bool keepOn{ true }; int numberOfFailures{ 0 }; for (int i = 0; keepOn && i < _expectedImagesFullFilenames.length(); ++i) { // First check that images are the same size QImage resultImage(_resultImagesFullFilenames[i]); QImage expectedImage(_expectedImagesFullFilenames[i]); double similarityIndex; // in [-1.0 .. 1.0], where 1.0 means images are identical double worstTileValue; // in [-1.0 .. 1.0], where 1.0 means images are identical bool isInteractiveMode = (!_isRunningFromCommandLine && _checkBoxInteractiveMode->isChecked() && !_isRunningInAutomaticTestRun); // similarityIndex is set to -100.0 to indicate images are not the same size if (isInteractiveMode && (resultImage.width() != expectedImage.width() || resultImage.height() != expectedImage.height())) { QMessageBox::critical(0, "Internal error: " + QString(__FILE__) + ":" + QString::number(__LINE__), "Images are not the same size"); similarityIndex = -100.0; worstTileValue = 0.0; } else { _imageComparer.compareImages(resultImage, expectedImage); similarityIndex = _imageComparer.getSSIMValue(); worstTileValue = _imageComparer.getWorstTileValue(); } TestResult testResult = TestResult{ similarityIndex, worstTileValue, _expectedImagesFullFilenames[i].left(_expectedImagesFullFilenames[i].lastIndexOf("/") + 1), // path to the test (including trailing /) QFileInfo(_expectedImagesFullFilenames[i].toStdString().c_str()).fileName(), // filename of expected image QFileInfo(_resultImagesFullFilenames[i].toStdString().c_str()).fileName(), // filename of result image _imageComparer.getSSIMResults() // results of SSIM algoritm }; _mismatchWindow.setTestResult(testResult); if (similarityIndex < THRESHOLD_GLOBAL || worstTileValue < THRESHOLD_LOCAL) { if (!isInteractiveMode) { ++numberOfFailures; appendTestResultsToFile(testResult, _mismatchWindow.getComparisonImage(), _mismatchWindow.getSSIMResultsImage(testResult._ssimResults), true); } else { _mismatchWindow.exec(); switch (_mismatchWindow.getUserResponse()) { case USER_RESPONSE_PASS: break; case USE_RESPONSE_FAIL: ++numberOfFailures; appendTestResultsToFile(testResult, _mismatchWindow.getComparisonImage(), _mismatchWindow.getSSIMResultsImage(testResult._ssimResults), true); break; case USER_RESPONSE_ABORT: keepOn = false; break; default: assert(false); break; } } } else { appendTestResultsToFile(testResult, _mismatchWindow.getComparisonImage(), _mismatchWindow.getSSIMResultsImage(testResult._ssimResults), false); } _progressBar->setValue(i); } _progressBar->setVisible(false); return numberOfFailures; }