summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/auto/declarative/visual/selftest_noimages/data/selftest_noimages.qml470
-rw-r--r--tests/auto/declarative/visual/selftest_noimages/selftest_noimages.qml9
-rw-r--r--tests/auto/declarative/visual/tst_visual.cpp64
-rw-r--r--tools/qmlviewer/main.cpp5
-rw-r--r--tools/qmlviewer/qfxtester.cpp21
-rw-r--r--tools/qmlviewer/qmlviewer.h7
6 files changed, 541 insertions, 35 deletions
diff --git a/tests/auto/declarative/visual/selftest_noimages/data/selftest_noimages.qml b/tests/auto/declarative/visual/selftest_noimages/data/selftest_noimages.qml
new file mode 100644
index 0000000..3104906
--- /dev/null
+++ b/tests/auto/declarative/visual/selftest_noimages/data/selftest_noimages.qml
@@ -0,0 +1,470 @@
+import Qt.VisualTest 4.6
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ }
+ Frame {
+ msec: 32
+ }
+ Frame {
+ msec: 48
+ }
+ Frame {
+ msec: 64
+ }
+ Frame {
+ msec: 80
+ }
+ Frame {
+ msec: 96
+ }
+ Frame {
+ msec: 112
+ }
+ Frame {
+ msec: 128
+ }
+ Frame {
+ msec: 144
+ }
+ Frame {
+ msec: 160
+ }
+ Frame {
+ msec: 176
+ }
+ Frame {
+ msec: 192
+ }
+ Frame {
+ msec: 208
+ }
+ Frame {
+ msec: 224
+ }
+ Frame {
+ msec: 240
+ }
+ Frame {
+ msec: 256
+ }
+ Frame {
+ msec: 272
+ }
+ Frame {
+ msec: 288
+ }
+ Frame {
+ msec: 304
+ }
+ Frame {
+ msec: 320
+ }
+ Frame {
+ msec: 336
+ }
+ Frame {
+ msec: 352
+ }
+ Frame {
+ msec: 368
+ }
+ Frame {
+ msec: 384
+ }
+ Frame {
+ msec: 400
+ }
+ Frame {
+ msec: 416
+ }
+ Frame {
+ msec: 432
+ }
+ Frame {
+ msec: 448
+ }
+ Frame {
+ msec: 464
+ }
+ Frame {
+ msec: 480
+ }
+ Frame {
+ msec: 496
+ }
+ Frame {
+ msec: 512
+ }
+ Frame {
+ msec: 528
+ }
+ Frame {
+ msec: 544
+ }
+ Frame {
+ msec: 560
+ }
+ Frame {
+ msec: 576
+ }
+ Frame {
+ msec: 592
+ }
+ Frame {
+ msec: 608
+ }
+ Frame {
+ msec: 624
+ }
+ Frame {
+ msec: 640
+ }
+ Frame {
+ msec: 656
+ }
+ Frame {
+ msec: 672
+ }
+ Frame {
+ msec: 688
+ }
+ Frame {
+ msec: 704
+ }
+ Frame {
+ msec: 720
+ }
+ Frame {
+ msec: 736
+ }
+ Frame {
+ msec: 752
+ }
+ Frame {
+ msec: 768
+ }
+ Frame {
+ msec: 784
+ }
+ Frame {
+ msec: 800
+ }
+ Frame {
+ msec: 816
+ }
+ Frame {
+ msec: 832
+ }
+ Frame {
+ msec: 848
+ }
+ Frame {
+ msec: 864
+ }
+ Frame {
+ msec: 880
+ }
+ Frame {
+ msec: 896
+ }
+ Frame {
+ msec: 912
+ }
+ Frame {
+ msec: 928
+ }
+ Frame {
+ msec: 944
+ }
+ Frame {
+ msec: 960
+ }
+ Frame {
+ msec: 976
+ }
+ Frame {
+ msec: 992
+ }
+ Frame {
+ msec: 1008
+ }
+ Frame {
+ msec: 1024
+ }
+ Frame {
+ msec: 1040
+ }
+ Frame {
+ msec: 1056
+ }
+ Frame {
+ msec: 1072
+ }
+ Frame {
+ msec: 1088
+ }
+ Frame {
+ msec: 1104
+ }
+ Frame {
+ msec: 1120
+ }
+ Frame {
+ msec: 1136
+ }
+ Frame {
+ msec: 1152
+ }
+ Frame {
+ msec: 1168
+ }
+ Frame {
+ msec: 1184
+ }
+ Frame {
+ msec: 1200
+ }
+ Frame {
+ msec: 1216
+ }
+ Frame {
+ msec: 1232
+ }
+ Frame {
+ msec: 1248
+ }
+ Frame {
+ msec: 1264
+ }
+ Frame {
+ msec: 1280
+ }
+ Frame {
+ msec: 1296
+ }
+ Frame {
+ msec: 1312
+ }
+ Frame {
+ msec: 1328
+ }
+ Frame {
+ msec: 1344
+ }
+ Frame {
+ msec: 1360
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 77; y: 7
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1376
+ }
+ Frame {
+ msec: 1392
+ }
+ Frame {
+ msec: 1408
+ }
+ Frame {
+ msec: 1424
+ }
+ Frame {
+ msec: 1440
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 77; y: 7
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1456
+ }
+ Frame {
+ msec: 1472
+ }
+ Frame {
+ msec: 1488
+ }
+ Frame {
+ msec: 1504
+ }
+ Frame {
+ msec: 1520
+ }
+ Frame {
+ msec: 1536
+ }
+ Frame {
+ msec: 1552
+ }
+ Frame {
+ msec: 1568
+ }
+ Frame {
+ msec: 1584
+ }
+ Frame {
+ msec: 1600
+ }
+ Frame {
+ msec: 1616
+ }
+ Frame {
+ msec: 1632
+ }
+ Frame {
+ msec: 1648
+ }
+ Frame {
+ msec: 1664
+ }
+ Frame {
+ msec: 1680
+ }
+ Frame {
+ msec: 1696
+ }
+ Frame {
+ msec: 1712
+ }
+ Frame {
+ msec: 1728
+ }
+ Frame {
+ msec: 1744
+ }
+ Frame {
+ msec: 1760
+ }
+ Frame {
+ msec: 1776
+ }
+ Frame {
+ msec: 1792
+ }
+ Frame {
+ msec: 1808
+ }
+ Frame {
+ msec: 1824
+ }
+ Frame {
+ msec: 1840
+ }
+ Frame {
+ msec: 1856
+ }
+ Frame {
+ msec: 1872
+ }
+ Frame {
+ msec: 1888
+ }
+ Frame {
+ msec: 1904
+ }
+ Frame {
+ msec: 1920
+ }
+ Frame {
+ msec: 1936
+ }
+ Frame {
+ msec: 1952
+ }
+ Frame {
+ msec: 1968
+ }
+ Frame {
+ msec: 1984
+ }
+ Frame {
+ msec: 2000
+ }
+ Frame {
+ msec: 2016
+ }
+ Frame {
+ msec: 2032
+ }
+ Frame {
+ msec: 2048
+ }
+ Frame {
+ msec: 2064
+ }
+ Frame {
+ msec: 2080
+ }
+ Frame {
+ msec: 2096
+ }
+ Frame {
+ msec: 2112
+ }
+ Frame {
+ msec: 2128
+ }
+ Frame {
+ msec: 2144
+ }
+ Frame {
+ msec: 2160
+ }
+ Frame {
+ msec: 2176
+ }
+ Frame {
+ msec: 2192
+ }
+ Frame {
+ msec: 2208
+ }
+ Frame {
+ msec: 2224
+ }
+ Frame {
+ msec: 2240
+ }
+ Frame {
+ msec: 2256
+ }
+ Frame {
+ msec: 2272
+ }
+ Frame {
+ msec: 2288
+ }
+ Frame {
+ msec: 2304
+ }
+ Frame {
+ msec: 2320
+ }
+ Frame {
+ msec: 2336
+ }
+ Frame {
+ msec: 2352
+ }
+ Frame {
+ msec: 2368
+ }
+ Frame {
+ msec: 2384
+ }
+}
diff --git a/tests/auto/declarative/visual/selftest_noimages/selftest_noimages.qml b/tests/auto/declarative/visual/selftest_noimages/selftest_noimages.qml
new file mode 100644
index 0000000..21a19bc
--- /dev/null
+++ b/tests/auto/declarative/visual/selftest_noimages/selftest_noimages.qml
@@ -0,0 +1,9 @@
+import Qt 4.6
+Text {
+ property string error: "not pressed"
+ text: (new Date()).valueOf()
+ MouseRegion {
+ anchors.fill: parent
+ onPressed: error=""
+ }
+}
diff --git a/tests/auto/declarative/visual/tst_visual.cpp b/tests/auto/declarative/visual/tst_visual.cpp
index a79b6f9..0cd712b 100644
--- a/tests/auto/declarative/visual/tst_visual.cpp
+++ b/tests/auto/declarative/visual/tst_visual.cpp
@@ -47,7 +47,7 @@
#include <QProcess>
#include <QFile>
-enum Mode { Record, Play, TestVisuals, UpdateVisuals, UpdatePlatformVisuals, Test };
+enum Mode { Record, RecordNoVisuals, Play, TestVisuals, RemoveVisuals, UpdateVisuals, UpdatePlatformVisuals, Test };
static QString testdir;
class tst_visual : public QObject
@@ -115,7 +115,7 @@ void tst_visual::visual()
QStringList arguments;
arguments << "-script" << testdata
- << "-scriptopts" << "play,testimages,exitoncomplete,exitonfailure"
+ << "-scriptopts" << "play,testimages,testerror,exitoncomplete,exitonfailure"
<< file;
QProcess p;
p.start(qmlviewer, arguments);
@@ -208,38 +208,44 @@ void action(Mode mode, const QString &file)
QString testdata = tst_visual::toTestScript(file,mode);
- if (Record == mode) {
- QStringList arguments;
- arguments << "-script" << testdata
+ QStringList arguments;
+ switch (mode) {
+ case Test:
+ // Don't run qmlviewer
+ break;
+ case Record:
+ arguments << "-script" << testdata
+ << "-scriptopts" << "record,testimages,saveonexit"
+ << file;
+ break;
+ case RecordNoVisuals:
+ arguments << "-script" << testdata
<< "-scriptopts" << "record,saveonexit"
<< file;
- QProcess p;
- p.setProcessChannelMode(QProcess::ForwardedChannels);
- p.start(tst_visual::viewer(), arguments);
- p.waitForFinished();
- } else if (Play == mode) {
- QStringList arguments;
- arguments << "-script" << testdata
- << "-scriptopts" << "play,testimages,exitoncomplete"
+ break;
+ case Play:
+ arguments << "-script" << testdata
+ << "-scriptopts" << "play,testimages,testerror,exitoncomplete"
<< file;
- QProcess p;
- p.setProcessChannelMode(QProcess::ForwardedChannels);
- p.start(tst_visual::viewer(), arguments);
- p.waitForFinished();
- } else if (TestVisuals == mode) {
- QStringList arguments;
+ break;
+ case TestVisuals:
arguments << "-script" << testdata
<< "-scriptopts" << "play"
<< file;
- QProcess p;
- p.setProcessChannelMode(QProcess::ForwardedChannels);
- p.start(tst_visual::viewer(), arguments);
- p.waitForFinished();
- } else if (UpdateVisuals == mode || UpdatePlatformVisuals == mode) {
- QStringList arguments;
- arguments << "-script" << testdata
+ break;
+ case UpdateVisuals:
+ case UpdatePlatformVisuals:
+ arguments << "-script" << testdata
+ << "-scriptopts" << "play,record,testimages,exitoncomplete,saveonexit"
+ << file;
+ break;
+ case RemoveVisuals:
+ arguments << "-script" << testdata
<< "-scriptopts" << "play,record,exitoncomplete,saveonexit"
<< file;
+ break;
+ }
+ if (!arguments.isEmpty()) {
QProcess p;
p.setProcessChannelMode(QProcess::ForwardedChannels);
p.start(tst_visual::viewer(), arguments);
@@ -278,9 +284,15 @@ int main(int argc, char **argv)
} else if (arg == "-record" && (ii + 1) < argc) {
mode = Record;
file = argv[++ii];
+ } else if (arg == "-recordnovisuals" && (ii + 1) < argc) {
+ mode = RecordNoVisuals;
+ file = argv[++ii];
} else if (arg == "-testvisuals" && (ii + 1) < argc) {
mode = TestVisuals;
file = argv[++ii];
+ } else if (arg == "-removevisuals" && (ii + 1) < argc) {
+ mode = RemoveVisuals;
+ file = argv[++ii];
} else if (arg == "-updatevisuals" && (ii + 1) < argc) {
mode = UpdateVisuals;
file = argv[++ii];
diff --git a/tools/qmlviewer/main.cpp b/tools/qmlviewer/main.cpp
index 23194b2..ac0d732 100644
--- a/tools/qmlviewer/main.cpp
+++ b/tools/qmlviewer/main.cpp
@@ -87,7 +87,8 @@ void scriptOptsUsage()
qWarning(" options:");
qWarning(" record ................................... record a new script");
qWarning(" play ..................................... playback an existing script");
- qWarning(" testimages ............................... compare images on playback");
+ qWarning(" testimages ............................... record images or compare images on playback");
+ qWarning(" testerror ................................ test 'error' property of root item on playback");
qWarning(" exitoncomplete ........................... cleanly exit the viewer on script completion");
qWarning(" exitonfailure ............................ immediately exit the viewer on script failure");
qWarning(" saveonexit ............................... save recording on viewer exit");
@@ -235,6 +236,8 @@ int main(int argc, char ** argv)
scriptOptions |= QmlViewer::Record;
} else if (option == QLatin1String("testimages")) {
scriptOptions |= QmlViewer::TestImages;
+ } else if (option == QLatin1String("testerror")) {
+ scriptOptions |= QmlViewer::TestErrorProperty;
} else if (option == QLatin1String("exitoncomplete")) {
scriptOptions |= QmlViewer::ExitOnComplete;
} else if (option == QLatin1String("exitonfailure")) {
diff --git a/tools/qmlviewer/qfxtester.cpp b/tools/qmlviewer/qfxtester.cpp
index 77e8124..287771b 100644
--- a/tools/qmlviewer/qfxtester.cpp
+++ b/tools/qmlviewer/qfxtester.cpp
@@ -146,6 +146,13 @@ void QmlGraphicsTester::imagefailure()
void QmlGraphicsTester::complete()
{
+ if ((options & QmlViewer::TestErrorProperty) && !hasFailed) {
+ QString e = m_view->root()->property("error").toString();
+ if (!e.isEmpty()) {
+ qWarning() << "Test failed:" << e;
+ hasFailed = true;
+ }
+ }
if (options & QmlViewer::ExitOnComplete)
QApplication::exit(hasFailed?-1:0);
@@ -240,13 +247,15 @@ void QmlGraphicsTester::updateCurrentTime(int msec)
QImage img(m_view->width(), m_view->height(), QImage::Format_RGB32);
- QPainter p(&img);
- m_view->render(&p);
+ if (options & QmlViewer::TestImages) {
+ QPainter p(&img);
+ m_view->render(&p);
+ }
FrameEvent fe;
fe.msec = msec;
- if (msec == 0) {
- // Skip first frame
+ if (msec == 0 || !(options & QmlViewer::TestImages)) {
+ // Skip first frame, skip if not doing images
} else if (0 == (m_savedFrameEvents.count() % 60)) {
fe.image = img;
} else {
@@ -297,6 +306,8 @@ void QmlGraphicsTester::updateCurrentTime(int msec)
QObject *event = testscript->event(testscriptidx);
if (QmlGraphicsVisualTestFrame *frame = qobject_cast<QmlGraphicsVisualTestFrame *>(event)) {
+ if ((options & QmlViewer::TestImages) && (options & QmlViewer::Record))
+ break; // recording and playing, no point "testing" results
if (frame->msec() < msec) {
if (options & QmlViewer::TestImages) {
qWarning() << "QmlGraphicsTester: Extra frame. Seen:"
@@ -304,7 +315,7 @@ void QmlGraphicsTester::updateCurrentTime(int msec)
imagefailure();
}
} else if (frame->msec() == msec) {
- if (frame->hash().toUtf8() != fe.hash.toHex()) {
+ if (!frame->hash().isEmpty() && frame->hash().toUtf8() != fe.hash.toHex()) {
if (options & QmlViewer::TestImages) {
qWarning() << "QmlGraphicsTester: Mismatched frame hash. Seen:"
<< fe.hash.toHex() << "Expected:"
diff --git a/tools/qmlviewer/qmlviewer.h b/tools/qmlviewer/qmlviewer.h
index a63b938..b366401 100644
--- a/tools/qmlviewer/qmlviewer.h
+++ b/tools/qmlviewer/qmlviewer.h
@@ -66,9 +66,10 @@ public:
Play = 0x00000001,
Record = 0x00000002,
TestImages = 0x00000004,
- SaveOnExit = 0x00000008,
- ExitOnComplete = 0x00000010,
- ExitOnFailure = 0x00000020
+ TestErrorProperty = 0x00000008,
+ SaveOnExit = 0x00000010,
+ ExitOnComplete = 0x00000020,
+ ExitOnFailure = 0x00000040
};
Q_DECLARE_FLAGS(ScriptOptions, ScriptOption)
void setScript(const QString &s) { m_script = s; }