aa5f78cb33
If create() or makeCurrent() calls fail, the test should fail fast. Change-Id: I025c541f94c8eee492cf0e1545bfbb8027eff2a7 Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
281 lines
7.9 KiB
C++
281 lines
7.9 KiB
C++
/****************************************************************************
|
|
**
|
|
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
|
|
** Contact: http://www.qt-project.org/legal
|
|
**
|
|
** This file is part of the test suite of the Qt Toolkit.
|
|
**
|
|
** $QT_BEGIN_LICENSE:LGPL$
|
|
** Commercial License Usage
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
** accordance with the commercial license agreement provided with the
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
** a written agreement between you and Digia. For licensing terms and
|
|
** conditions see http://qt.digia.com/licensing. For further information
|
|
** use the contact form at http://qt.digia.com/contact-us.
|
|
**
|
|
** GNU Lesser General Public License Usage
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
** General Public License version 2.1 as published by the Free Software
|
|
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
** packaging of this file. Please review the following information to
|
|
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
**
|
|
** In addition, as a special exception, Digia gives you certain additional
|
|
** rights. These rights are described in the Digia Qt LGPL Exception
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
**
|
|
** GNU General Public License Usage
|
|
** Alternatively, this file may be used under the terms of the GNU
|
|
** General Public License version 3.0 as published by the Free Software
|
|
** Foundation and appearing in the file LICENSE.GPL included in the
|
|
** packaging of this file. Please review the following information to
|
|
** ensure the GNU General Public License version 3.0 requirements will be
|
|
** met: http://www.gnu.org/copyleft/gpl.html.
|
|
**
|
|
**
|
|
** $QT_END_LICENSE$
|
|
**
|
|
****************************************************************************/
|
|
|
|
#include "paintcommands.h"
|
|
#include <qbaselinetest.h>
|
|
#include <QDir>
|
|
#include <QPainter>
|
|
|
|
#ifndef QT_NO_OPENGL
|
|
#include <QOpenGLFramebufferObjectFormat>
|
|
#include <QOpenGLContext>
|
|
#include <QOpenGLPaintDevice>
|
|
#endif
|
|
|
|
class tst_Lancelot : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
tst_Lancelot();
|
|
|
|
private:
|
|
enum GraphicsEngine {
|
|
Raster = 0,
|
|
OpenGL = 1
|
|
};
|
|
|
|
void setupTestSuite(const QStringList& blacklist = QStringList());
|
|
void runTestSuite(GraphicsEngine engine, QImage::Format format);
|
|
void paint(QPaintDevice *device, GraphicsEngine engine, const QStringList &script, const QString &filePath);
|
|
|
|
QStringList qpsFiles;
|
|
QHash<QString, QStringList> scripts;
|
|
QHash<QString, quint16> scriptChecksums;
|
|
QString scriptsDir;
|
|
|
|
private slots:
|
|
void initTestCase();
|
|
void cleanupTestCase() {}
|
|
|
|
void testRasterARGB32PM_data();
|
|
void testRasterARGB32PM();
|
|
void testRasterRGB32_data();
|
|
void testRasterRGB32();
|
|
void testRasterRGB16_data();
|
|
void testRasterRGB16();
|
|
|
|
#ifndef QT_NO_OPENGL
|
|
void testOpenGL_data();
|
|
void testOpenGL();
|
|
private:
|
|
bool checkSystemGLSupport();
|
|
#endif
|
|
};
|
|
|
|
tst_Lancelot::tst_Lancelot()
|
|
{
|
|
}
|
|
|
|
void tst_Lancelot::initTestCase()
|
|
{
|
|
// Check and setup the environment. We treat failures because of test environment
|
|
// (e.g. script files not found) as just warnings, and not QFAILs, to avoid false negatives
|
|
// caused by environment or server instability
|
|
|
|
QByteArray msg;
|
|
if (!QBaselineTest::connectToBaselineServer(&msg))
|
|
QSKIP(msg);
|
|
|
|
QString baseDir = QFINDTESTDATA("scripts/text.qps");
|
|
scriptsDir = baseDir.left(baseDir.lastIndexOf('/')) + '/';
|
|
QDir qpsDir(scriptsDir);
|
|
qpsFiles = qpsDir.entryList(QStringList() << QLatin1String("*.qps"), QDir::Files | QDir::Readable);
|
|
if (qpsFiles.isEmpty()) {
|
|
QWARN("No qps script files found in " + qpsDir.path().toLatin1());
|
|
QSKIP("Aborted due to errors.");
|
|
}
|
|
|
|
qSort(qpsFiles);
|
|
foreach (const QString& fileName, qpsFiles) {
|
|
QFile file(scriptsDir + fileName);
|
|
file.open(QFile::ReadOnly);
|
|
QByteArray cont = file.readAll();
|
|
scripts.insert(fileName, QString::fromUtf8(cont).split(QLatin1Char('\n'), QString::SkipEmptyParts));
|
|
scriptChecksums.insert(fileName, qChecksum(cont.constData(), cont.size()));
|
|
}
|
|
}
|
|
|
|
|
|
void tst_Lancelot::testRasterARGB32PM_data()
|
|
{
|
|
setupTestSuite();
|
|
}
|
|
|
|
|
|
void tst_Lancelot::testRasterARGB32PM()
|
|
{
|
|
runTestSuite(Raster, QImage::Format_ARGB32_Premultiplied);
|
|
}
|
|
|
|
|
|
void tst_Lancelot::testRasterRGB32_data()
|
|
{
|
|
setupTestSuite();
|
|
}
|
|
|
|
|
|
void tst_Lancelot::testRasterRGB32()
|
|
{
|
|
runTestSuite(Raster, QImage::Format_RGB32);
|
|
}
|
|
|
|
|
|
void tst_Lancelot::testRasterRGB16_data()
|
|
{
|
|
setupTestSuite();
|
|
}
|
|
|
|
|
|
void tst_Lancelot::testRasterRGB16()
|
|
{
|
|
runTestSuite(Raster, QImage::Format_RGB16);
|
|
}
|
|
|
|
|
|
#ifndef QT_NO_OPENGL
|
|
bool tst_Lancelot::checkSystemGLSupport()
|
|
{
|
|
QWindow win;
|
|
win.setSurfaceType(QSurface::OpenGLSurface);
|
|
win.create();
|
|
QOpenGLFramebufferObjectFormat fmt;
|
|
fmt.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
|
|
fmt.setSamples(4);
|
|
QOpenGLContext ctx;
|
|
if (!ctx.create() || !ctx.makeCurrent(&win))
|
|
return false;
|
|
QOpenGLFramebufferObject fbo(800, 800, fmt);
|
|
if (!fbo.isValid() || !fbo.bind())
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
void tst_Lancelot::testOpenGL_data()
|
|
{
|
|
if (!checkSystemGLSupport())
|
|
QSKIP("System under test does not meet preconditions for GL testing. Skipping.");
|
|
QStringList localBlacklist = QStringList() << QLatin1String("rasterops.qps");
|
|
setupTestSuite(localBlacklist);
|
|
}
|
|
|
|
|
|
void tst_Lancelot::testOpenGL()
|
|
{
|
|
runTestSuite(OpenGL, QImage::Format_RGB32);
|
|
}
|
|
#endif
|
|
|
|
|
|
void tst_Lancelot::setupTestSuite(const QStringList& blacklist)
|
|
{
|
|
QTest::addColumn<QString>("qpsFile");
|
|
foreach (const QString &fileName, qpsFiles) {
|
|
if (blacklist.contains(fileName))
|
|
continue;
|
|
QBaselineTest::newRow(fileName.toLatin1(), scriptChecksums.value(fileName)) << fileName;
|
|
}
|
|
}
|
|
|
|
|
|
void tst_Lancelot::runTestSuite(GraphicsEngine engine, QImage::Format format)
|
|
{
|
|
QFETCH(QString, qpsFile);
|
|
|
|
QString filePath = scriptsDir + qpsFile;
|
|
QStringList script = scripts.value(qpsFile);
|
|
QImage rendered;
|
|
|
|
if (engine == Raster) {
|
|
QImage img(800, 800, format);
|
|
paint(&img, engine, script, QFileInfo(filePath).absoluteFilePath());
|
|
rendered = img;
|
|
#ifndef QT_NO_OPENGL
|
|
} else if (engine == OpenGL) {
|
|
QWindow win;
|
|
win.setSurfaceType(QSurface::OpenGLSurface);
|
|
win.create();
|
|
QOpenGLFramebufferObjectFormat fmt;
|
|
fmt.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
|
|
fmt.setSamples(4);
|
|
QOpenGLContext ctx;
|
|
QVERIFY(ctx.create());
|
|
QVERIFY(ctx.makeCurrent(&win));
|
|
QOpenGLFramebufferObject fbo(800, 800, fmt);
|
|
fbo.bind();
|
|
QOpenGLPaintDevice pdv(800, 800);
|
|
paint(&pdv, engine, script, QFileInfo(filePath).absoluteFilePath());
|
|
rendered = fbo.toImage().convertToFormat(format);
|
|
#endif
|
|
}
|
|
|
|
QBASELINE_TEST(rendered);
|
|
}
|
|
|
|
void tst_Lancelot::paint(QPaintDevice *device, GraphicsEngine engine, const QStringList &script, const QString &filePath)
|
|
{
|
|
QPainter p(device);
|
|
PaintCommands pcmd(script, 800, 800);
|
|
//pcmd.setShouldDrawText(false);
|
|
switch (engine) {
|
|
case OpenGL:
|
|
pcmd.setType(OpenGLBufferType);
|
|
break;
|
|
case Raster: // fallthrough
|
|
default:
|
|
pcmd.setType(ImageType);
|
|
break;
|
|
}
|
|
pcmd.setPainter(&p);
|
|
pcmd.setFilePath(filePath);
|
|
pcmd.runCommands();
|
|
p.end();
|
|
}
|
|
|
|
#define main _realmain
|
|
QTEST_MAIN(tst_Lancelot)
|
|
#undef main
|
|
|
|
QT_BEGIN_NAMESPACE
|
|
extern Q_DECL_IMPORT QBasicAtomicInt qt_qhash_seed; // from qhash.cpp
|
|
QT_END_NAMESPACE
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
qt_qhash_seed.store(0); // Avoid rendering variations caused by QHash randomization
|
|
|
|
QBaselineTest::handleCmdLineArgs(&argc, &argv);
|
|
return _realmain(argc, argv);
|
|
}
|
|
|
|
#include "tst_lancelot.moc"
|