diff options
-rw-r--r-- | src/imports/testlib/TestCase.qml | 24 | ||||
-rw-r--r-- | src/qmltest/quicktestresult.cpp | 40 | ||||
-rw-r--r-- | tests/auto/qmltest/selftests/BLACKLIST | 5 | ||||
-rw-r--r-- | tests/auto/qmltest/selftests/tst_grabImage.qml | 51 |
4 files changed, 118 insertions, 2 deletions
diff --git a/src/imports/testlib/TestCase.qml b/src/imports/testlib/TestCase.qml index 8c1744a2b2..dbed896c59 100644 --- a/src/imports/testlib/TestCase.qml +++ b/src/imports/testlib/TestCase.qml @@ -837,7 +837,14 @@ Item { Returns a snapshot image object of the given \a item. - The returned image object has the following methods: + The returned image object has the following properties: + \list + \li width Returns the width of the underlying image (since 5.10) + \li height Returns the height of the underlying image (since 5.10) + \li size Returns the size of the underlying image (since 5.10) + \endlist + + Additionally, the returned image object has the following methods: \list \li red(x, y) Returns the red channel value of the pixel at \a x, \a y position \li green(x, y) Returns the green channel value of the pixel at \a x, \a y position @@ -858,6 +865,21 @@ Item { var newImage = grabImage(rect); verify(!newImage.equals(image)); \endcode + \li save(path) Saves the image to the given \a path. If the image cannot + be saved, an exception will be thrown. (since 5.10) + + This can be useful to perform postmortem analysis on failing tests, for + example: + + \code + var image = grabImage(rect); + try { + compare(image.width, 100); + } catch (ex) { + image.save("debug.png"); + throw ex; + } + \endcode \endlist diff --git a/src/qmltest/quicktestresult.cpp b/src/qmltest/quicktestresult.cpp index dc6caf505b..3650df8f3a 100644 --- a/src/qmltest/quicktestresult.cpp +++ b/src/qmltest/quicktestresult.cpp @@ -1,5 +1,6 @@ /**************************************************************************** ** +** Copyright (C) 2017 Crimson AS <info@crimson.no> ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** @@ -61,7 +62,10 @@ #include <QtCore/QDir> #include <QtQuick/qquickwindow.h> #include <QtGui/qvector3d.h> +#include <QtGui/qimagewriter.h> #include <QtQml/private/qqmlglobal_p.h> +#include <QtQml/QQmlEngine> +#include <QtQml/QQmlContext> #include <private/qv4qobjectwrapper_p.h> #include <algorithm> @@ -77,6 +81,11 @@ extern bool qWaitForSignal(QObject *obj, const char* signal, int timeout = 5000) class Q_QUICK_TEST_EXPORT QuickTestImageObject : public QObject { Q_OBJECT + + Q_PROPERTY(int width READ width CONSTANT) + Q_PROPERTY(int height READ height CONSTANT) + Q_PROPERTY(QSize size READ size CONSTANT) + public: QuickTestImageObject(const QImage& img, QObject *parent = 0) : QObject(parent) @@ -127,6 +136,33 @@ public Q_SLOTS: return m_image == other->m_image; } + + void save(const QString &filePath) + { + QImageWriter writer(filePath); + if (!writer.write(m_image)) { + QQmlEngine *engine = qmlContext(this)->engine(); + QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine->handle()); + v4->throwError(QStringLiteral("Can't save to %1: %2").arg(filePath, writer.errorString())); + } + } + +public: + int width() const + { + return m_image.width(); + } + + int height() const + { + return m_image.height(); + } + + QSize size() const + { + return m_image.size(); + } + private: QImage m_image; }; @@ -706,7 +742,9 @@ QObject *QuickTestResult::grabImage(QQuickItem *item) QImage grabbed = window->grabWindow(); QRectF rf(item->x(), item->y(), item->width(), item->height()); rf = rf.intersected(QRectF(0, 0, grabbed.width(), grabbed.height())); - return new QuickTestImageObject(grabbed.copy(rf.toAlignedRect())); + QObject *o = new QuickTestImageObject(grabbed.copy(rf.toAlignedRect())); + QQmlEngine::setContextForObject(o, qmlContext(this)); + return o; } return 0; } diff --git a/tests/auto/qmltest/selftests/BLACKLIST b/tests/auto/qmltest/selftests/BLACKLIST index 9cb2313810..ffce42e4c0 100644 --- a/tests/auto/qmltest/selftests/BLACKLIST +++ b/tests/auto/qmltest/selftests/BLACKLIST @@ -6,3 +6,8 @@ # QTBUG-53793: seems to be failing on Linux a little too often... [tst_grabImage::test_equals] linux +[tst_grabImage::test_sizeProps] +linux +[tst_grabImage::test_save] +linux + diff --git a/tests/auto/qmltest/selftests/tst_grabImage.qml b/tests/auto/qmltest/selftests/tst_grabImage.qml index 954daaba42..50c441ab87 100644 --- a/tests/auto/qmltest/selftests/tst_grabImage.qml +++ b/tests/auto/qmltest/selftests/tst_grabImage.qml @@ -1,5 +1,6 @@ /**************************************************************************** ** +** Copyright (C) 2017 Crimson AS <info@crimson.no> ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** @@ -50,4 +51,54 @@ TestCase { verify(!newImage.equals(null)); verify(!newImage.equals(undefined)); } + + function test_sizeProps() { + var rect = createTemporaryQmlObject("import QtQuick 2.0; Rectangle { color: 'red'; width: 10; height: 20; }", testCase); + var image = grabImage(rect); + + try { + compare(image.width, 10) + compare(image.height, 20) + compare(image.size, Qt.size(10, 20)) + } catch (ex) { + image.save("tst_grabImage_test_sizeProps.png") + throw ex; + } + } + + function test_save() { + var rect = createTemporaryQmlObject("import QtQuick 2.0; Rectangle { color: 'red'; width: 10; height: 20; }", testCase); + var grabbedImage = grabImage(rect); + grabbedImage.save("tst_grabImage_test_save.png") + + // Now try to load it + var url = Qt.resolvedUrl("tst_grabImage_test_save.png") + var image = createTemporaryQmlObject("import QtQuick 2.0; Image { source: \"" + url + "\" }", testCase); + tryCompare(image, "status", Image.Ready) + var grabbedImage2 = grabImage(image); + + try { + verify(grabbedImage2.equals(grabbedImage)) + } catch (ex) { + grabbedImage2.save("tst_grabImage_test_save2.png") + throw ex; + } + } + + function test_saveThrowsWhenFailing() { + var rect = createTemporaryQmlObject("import QtQuick 2.0; Rectangle { color: 'red'; width: 10; height: 20; }", testCase); + var grabbedImage = grabImage(rect); + var didThrow = false; + + try { + // Format doesn't exist, so this will throw + grabbedImage.save("tst_grabImage_test_saveThrowsWhenFailing.never-gonna-give-you-up"); + } catch (ex) { + didThrow = true; + } + + if (!didThrow) { + fail("save() should have thrown, but didn't!") + } + } } |