Say hello to the scene graph sanity-tests for rendering
Change-Id: I5d975735b0975f284b8aee15541f208e3deb704f Reviewed-by: Alan Alpert <aalpert@blackberry.com>
This commit is contained in:
parent
50a3ddcbbf
commit
b7f6382b1e
|
@ -0,0 +1,84 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** 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$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.2
|
||||
|
||||
Item
|
||||
{
|
||||
id: root
|
||||
|
||||
width: 200
|
||||
height: 200
|
||||
|
||||
signal enterFinalStage
|
||||
|
||||
property bool finalStageComplete: false;
|
||||
|
||||
/* What comes below is some convenience for running the .qml files s
|
||||
* standalone using qmlscene. This can be quite handy when debugging
|
||||
* issues.
|
||||
*/
|
||||
|
||||
onFinalStageCompleteChanged: {
|
||||
if (typeof suite == 'undefined') {
|
||||
print("-> final stage complete");
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
if (typeof suite == 'undefined') {
|
||||
print("-> not running in testsuite, now in initial state")
|
||||
suiteFaker.running = true;
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: suiteFaker
|
||||
running: false;
|
||||
interval: 1000
|
||||
repeat: false;
|
||||
onTriggered: {
|
||||
print("-> entering final stage")
|
||||
enterFinalStage();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** 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$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.2
|
||||
|
||||
/*
|
||||
The test verifies that batches of translucent items get split
|
||||
into multiple batches when an item in them change opacity.
|
||||
|
||||
PixelPos R G B Error-tolerance
|
||||
#base: 0 0 1.0 0.5 0.5 0.05
|
||||
#base: 100 0 0.5 0.5 1.0 0.05
|
||||
#base: 0 100 1.0 0.5 0.5 0.05
|
||||
#base: 100 100 0.5 0.5 1.0 0.05
|
||||
#final: 0 0 1.0 0.5 0.5 0.05
|
||||
#final: 100 0 0.1 0.1 1.0 0.05
|
||||
#final: 0 100 1.0 0.5 0.5 0.05
|
||||
#final: 100 100 0.9 0.9 1.0 0.05
|
||||
|
||||
#samples: 8
|
||||
*/
|
||||
|
||||
RenderTestBase {
|
||||
|
||||
Item {
|
||||
Rectangle { id: redUnclipped; opacity: 0.5; width: 50; height: 50; color: "red" }
|
||||
Rectangle { id: blueUnclipped; opacity: 0.5; width: 50; height: 50; color: "blue"; x: 100 }
|
||||
}
|
||||
|
||||
Item {
|
||||
clip: true;
|
||||
y: 100
|
||||
width: 200
|
||||
height: 100
|
||||
Rectangle { id: redClipped; opacity: 0.5; width: 50; height: 50; color: "red" }
|
||||
Rectangle { id: blueClipped; opacity: 0.5; width: 50; height: 50; color: "blue"; x: 100 }
|
||||
}
|
||||
|
||||
onEnterFinalStage: {
|
||||
blueUnclipped.opacity = 0.9
|
||||
blueClipped.opacity = 0.1
|
||||
finalStageComplete = true;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,113 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** 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$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.2
|
||||
|
||||
/*
|
||||
The purpose of the test is to verify that a batch of more than 64K
|
||||
vertices gets split into multiple drawsets and still rendered correctly.
|
||||
Both the clipped and unclipped batches have 50.000 rectangles resulting
|
||||
in 200.000 vertices in each batch, which should be plenty..
|
||||
|
||||
#samples: 8
|
||||
|
||||
PixelPos R G B Error-tolerance
|
||||
#base: 0 0 1.0 0.0 0.0 0.0
|
||||
#base: 99 199 1.0 0.0 0.0 0.0
|
||||
#base: 100 0 0.0 0.0 0.0 0.0
|
||||
#base: 199 199 0.0 0.0 0.0 0.0
|
||||
#final: 0 0 0.0 0.0 1.0 0.0
|
||||
#final: 99 199 0.0 0.0 1.0 0.0
|
||||
#final: 100 0 0.0 1.0 0.0 0.0
|
||||
#final: 199 199 0.0 1.0 0.0 0.0
|
||||
*/
|
||||
|
||||
RenderTestBase
|
||||
{
|
||||
id: root
|
||||
|
||||
Grid {
|
||||
id: clipped
|
||||
width: 100
|
||||
height: 500
|
||||
clip: true
|
||||
columns: 100
|
||||
Repeater {
|
||||
id: clippedRepeater
|
||||
model: clipped.width * clipped.height
|
||||
Rectangle {
|
||||
width: 1
|
||||
height: 1
|
||||
color: index < clippedRepeater.model / 2 ? "red" : "blue";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Grid {
|
||||
id: unclipped
|
||||
x: 100
|
||||
width: 100
|
||||
height: 500
|
||||
clip: true
|
||||
columns: 100
|
||||
Repeater {
|
||||
id: unclippedRepeater
|
||||
model: unclipped.width * unclipped.height
|
||||
Rectangle {
|
||||
width: 1
|
||||
height: 1
|
||||
color: index < unclippedRepeater.model / 2 ? "black" : "#00ff00";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SequentialAnimation {
|
||||
id: animation
|
||||
NumberAnimation { target: clipped; property: "y"; from: 0; to: -clipped.height + root.height; duration: 100 }
|
||||
NumberAnimation { target: unclipped; property: "y"; from: 0; to: -unclipped.height + root.height; duration: 100 }
|
||||
PropertyAction { target: root; property: "finalStageComplete"; value: true; }
|
||||
}
|
||||
|
||||
onEnterFinalStage: {
|
||||
animation.running = true;
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** 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$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.2
|
||||
|
||||
/*
|
||||
This test verifies that items that go from being batched because
|
||||
of no overlap will be split into multiple batches because of an
|
||||
overlap and that no rendering errors occur as a result of this.
|
||||
|
||||
#samples: 8
|
||||
PixelPos R G B Error-tolerance
|
||||
#base: 0 0 0.0 0.0 0.0 0.0
|
||||
#base: 10 10 0.5 0.0 0.0 0.05
|
||||
#base: 100 100 0.0 0.0 0.0 0.0
|
||||
#base: 110 110 0.5 0.0 0.0 0.05
|
||||
#final: 40 40 0.0 0.0 0.0 0.0
|
||||
#final: 50 50 0.5 0.0 0.0 0.05
|
||||
#final: 60 60 0.0 0.0 0.0 0.0
|
||||
#final: 70 70 0.5 0.0 0.0 0.05
|
||||
*/
|
||||
|
||||
RenderTestBase {
|
||||
id: root
|
||||
|
||||
Rectangle {
|
||||
id: one
|
||||
x: 0
|
||||
y: x
|
||||
width: 80
|
||||
height: 80
|
||||
color: "black"
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 10
|
||||
color: "red"
|
||||
opacity: 0.5
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: two
|
||||
x: 100
|
||||
y: x
|
||||
width: 80
|
||||
height: 80
|
||||
color: "black"
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 10
|
||||
color: "red"
|
||||
opacity: 0.5
|
||||
}
|
||||
}
|
||||
|
||||
SequentialAnimation {
|
||||
id: animation
|
||||
ParallelAnimation {
|
||||
NumberAnimation { target: one; property: "x"; from: 0; to: 40; duration: 100 }
|
||||
NumberAnimation { target: two; property: "x"; from: 100; to: 60; duration: 100 }
|
||||
}
|
||||
PropertyAction { target: root; property: "finalStageComplete"; value: true; }
|
||||
}
|
||||
|
||||
onEnterFinalStage: {
|
||||
animation.running = true;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,88 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** 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$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.2
|
||||
|
||||
/*
|
||||
The test verifies that batching does not interfere with overlapping
|
||||
regions.
|
||||
|
||||
#samples: 4
|
||||
PixelPos R G B Error-tolerance
|
||||
#base: 20 20 0.0 0.0 0.0 0.0
|
||||
#base: 30 30 0.5 0.0 0.0 0.05
|
||||
#final: 50 50 0.0 0.0 0.0 0.0
|
||||
#final: 60 60 0.5 0.0 0.0 0.05
|
||||
*/
|
||||
|
||||
RenderTestBase
|
||||
{
|
||||
Rectangle {
|
||||
x: 20
|
||||
y: 20
|
||||
width: 80
|
||||
height: 80
|
||||
color: "black"
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 10
|
||||
color: "red"
|
||||
opacity: 0.5
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
x: 50
|
||||
y: 50
|
||||
width: 80
|
||||
height: 80
|
||||
color: "black"
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 10
|
||||
color: "red"
|
||||
opacity: 0.5
|
||||
}
|
||||
}
|
||||
|
||||
finalStageComplete: true
|
||||
}
|
|
@ -56,6 +56,8 @@ private slots:
|
|||
void manyWindows_data();
|
||||
void manyWindows();
|
||||
|
||||
void render_data();
|
||||
void render();
|
||||
};
|
||||
|
||||
template <typename T> class ScopedList : public QList<T> {
|
||||
|
@ -229,6 +231,173 @@ void tst_SceneGraph::manyWindows()
|
|||
}
|
||||
}
|
||||
|
||||
struct Sample {
|
||||
Sample(int xx, int yy, qreal rr, qreal gg, qreal bb, qreal errorMargin = 0.05)
|
||||
: x(xx)
|
||||
, y(yy)
|
||||
, r(rr)
|
||||
, g(gg)
|
||||
, b(bb)
|
||||
, tolerance(errorMargin)
|
||||
{
|
||||
}
|
||||
Sample(const Sample &o) : x(o.x), y(o.y), r(o.r), g(o.g), b(o.b), tolerance(o.tolerance) { }
|
||||
Sample() : x(0), y(0), r(0), g(0), b(0), tolerance(0) { }
|
||||
|
||||
QString toString(const QImage &image) const {
|
||||
QColor color(image.pixel(x,y));
|
||||
return QString::fromLatin1("pixel(%1,%2), rgb(%3,%4,%5), tolerance=%6 -- image(%7,%8,%9)")
|
||||
.arg(x).arg(y)
|
||||
.arg(r).arg(g).arg(b)
|
||||
.arg(tolerance)
|
||||
.arg(color.redF()).arg(color.greenF()).arg(color.blueF());
|
||||
}
|
||||
|
||||
bool check(const QImage &image) {
|
||||
QColor color(image.pixel(x, y));
|
||||
return qAbs(color.redF() - r) <= tolerance
|
||||
&& qAbs(color.greenF() - g) <= tolerance
|
||||
&& qAbs(color.blueF() - b) <= tolerance;
|
||||
}
|
||||
|
||||
|
||||
int x, y;
|
||||
qreal r, g, b;
|
||||
qreal tolerance;
|
||||
};
|
||||
|
||||
static Sample sample_from_regexp(QRegExp *re) {
|
||||
return Sample(re->cap(1).toInt(),
|
||||
re->cap(2).toInt(),
|
||||
re->cap(3).toFloat(),
|
||||
re->cap(4).toFloat(),
|
||||
re->cap(5).toFloat(),
|
||||
re->cap(6).toFloat()
|
||||
);
|
||||
}
|
||||
|
||||
Q_DECLARE_METATYPE(Sample);
|
||||
|
||||
/*
|
||||
The render() test implements a small test framework for itself with
|
||||
the purpose of testing odds and ends of the scene graph
|
||||
rendering. Each .qml file can consist of one or two stages. The
|
||||
first stage is when the file is first displayed. The content is
|
||||
grabbed and matched against 'base' samples defined in the .qml file
|
||||
itself. The samples contain a pixel position, and RGB value and a
|
||||
margin of error. The samples are defined in the .qml file so it is
|
||||
easy to make the connection between colors and positions on the screen.
|
||||
|
||||
If the base stage samples all succeed, the test emits
|
||||
'enterFinalStage' on the root item and waits for the .qml file to
|
||||
update the value of 'finalStageComplete' The test can set this
|
||||
directly or run an animation and set it later. Once the
|
||||
'finalStageComplete' variable is true, we grab and match against the
|
||||
second set of samples 'final'
|
||||
|
||||
The samples in the .qml file are defined in comments on the format:
|
||||
#base: x y r g b error-tolerance
|
||||
#final: x y r g b error-tolerance
|
||||
- x and y are integers
|
||||
- r g b are floats in the range of 0.0-1.0
|
||||
- error-tolerance is a float in the range of 0.0-1.0
|
||||
|
||||
We also include a
|
||||
#samples: count
|
||||
to sanity check that all base/final samples were matched correctly
|
||||
as the matching regexp is a bit crude.
|
||||
|
||||
To add new tests, add them to the 'files' list and put #base,
|
||||
#final, #samples tags into the .qml file
|
||||
*/
|
||||
|
||||
void tst_SceneGraph::render_data()
|
||||
{
|
||||
QTest::addColumn<QString>("file");
|
||||
QTest::addColumn<QList<Sample> >("baseStage");
|
||||
QTest::addColumn<QList<Sample> >("finalStage");
|
||||
|
||||
QList<QString> files;
|
||||
files << "data/render_DrawSets.qml"
|
||||
<< "data/render_Overlap.qml"
|
||||
<< "data/render_MovingOverlap.qml"
|
||||
<< "data/render_BreakOpacityBatch.qml"
|
||||
;
|
||||
|
||||
QRegExp sampleCount("#samples: *(\\d+)");
|
||||
// X:int Y:int R:float G:float B:float Error:float
|
||||
QRegExp baseSamples("#base: *(\\d+) *(\\d+) *(\\d\\.\\d+) *(\\d\\.\\d+) *(\\d\\.\\d+) *(\\d\\.\\d+)");
|
||||
QRegExp finalSamples("#final: *(\\d+) *(\\d+) *(\\d\\.\\d+) *(\\d\\.\\d+) *(\\d\\.\\d+) *(\\d\\.\\d+)");
|
||||
|
||||
foreach (QString fileName, files) {
|
||||
QFile file(fileName);
|
||||
if (!file.open(QFile::ReadOnly)) {
|
||||
qFatal("render_data: QFile::open failed! file=%s, error=%s",
|
||||
qPrintable(fileName), qPrintable(file.errorString()));
|
||||
}
|
||||
QStringList contents = QString::fromLatin1(file.readAll()).split(QLatin1Char('\n'));
|
||||
|
||||
int samples = -1;
|
||||
foreach (QString line, contents) {
|
||||
if (sampleCount.indexIn(line) >= 0) {
|
||||
samples = sampleCount.cap(1).toInt();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (samples == -1)
|
||||
qFatal("render_data: failed to find string '#samples: [count], file=%s", qPrintable(fileName));
|
||||
|
||||
QList<Sample> baseStage, finalStage;
|
||||
foreach (QString line, contents) {
|
||||
if (baseSamples.indexIn(line) >= 0)
|
||||
baseStage << sample_from_regexp(&baseSamples);
|
||||
else if (finalSamples.indexIn(line) >= 0)
|
||||
finalStage << sample_from_regexp(&finalSamples);
|
||||
}
|
||||
|
||||
if (baseStage.size() + finalStage.size() != samples)
|
||||
qFatal("render_data: #samples does not add up to number of counted samples, file=%s", qPrintable(fileName));
|
||||
|
||||
QTest::newRow(qPrintable(fileName)) << fileName << baseStage << finalStage;
|
||||
}
|
||||
}
|
||||
|
||||
void tst_SceneGraph::render()
|
||||
{
|
||||
QFETCH(QString, file);
|
||||
QFETCH(QList<Sample>, baseStage);
|
||||
QFETCH(QList<Sample>, finalStage);
|
||||
|
||||
QObject suite;
|
||||
suite.setObjectName("The Suite");
|
||||
|
||||
QQuickView view;
|
||||
view.rootContext()->setContextProperty("suite", &suite);
|
||||
view.setSource(QUrl::fromLocalFile(file));
|
||||
view.setResizeMode(QQuickView::SizeViewToRootObject);
|
||||
view.show();
|
||||
QVERIFY(QTest::qWaitForWindowExposed(&view));
|
||||
|
||||
// Grab the window and check all our base stage samples
|
||||
QImage content = view.grabWindow();
|
||||
for (int i=0; i<baseStage.size(); ++i) {
|
||||
Sample sample = baseStage.at(i);
|
||||
QVERIFY2(sample.check(content), qPrintable(sample.toString(content)));
|
||||
}
|
||||
|
||||
// Put the qml file into the final stage and wait for it to
|
||||
// complete it.
|
||||
QQuickItem *rootItem = view.rootObject();
|
||||
QMetaObject::invokeMethod(rootItem, "enterFinalStage");
|
||||
QTRY_VERIFY(rootItem->property("finalStageComplete").toBool());
|
||||
|
||||
// The grab the results and verify the samples in the end state.
|
||||
content = view.grabWindow();
|
||||
for (int i=0; i<finalStage.size(); ++i) {
|
||||
Sample sample = finalStage.at(i);
|
||||
QVERIFY2(sample.check(content), qPrintable(sample.toString(content)));
|
||||
}
|
||||
}
|
||||
|
||||
#include "tst_scenegraph.moc"
|
||||
|
||||
|
|
Loading…
Reference in New Issue