QTestlib: Make QImage comparison more verbose.
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>
Mon, 19 Dec 2011 10:33:07 +0000 (11:33 +0100)
committerQt by Nokia <qt-info@nokia.com>
Wed, 21 Dec 2011 21:59:28 +0000 (22:59 +0100)
Introduce a specialization for qCompare(QImage,QImage) that
checks isNull, size and format and outputs verbose messages.

Check isNull, size similarly for QPixmap.

Add an autotest:
- Add test to cmptest and make it a GUI application since
  QImage requires QGuiApplication.
- Make testlib/selftests capable of running X11-GUI applications
  by passing DISPLAY.
- Ignore stderr output for cmptest
- Add test data

Change-Id: I2b29c7822fbeedf2b22c90889739ed7ff859ce92
Reviewed-by: Jason McDonald <jason.mcdonald@nokia.com>
src/testlib/qtest_gui.h
tests/auto/testlib/selftests/cmptest/cmptest.pro
tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp
tests/auto/testlib/selftests/expected_cmptest.lightxml
tests/auto/testlib/selftests/expected_cmptest.txt
tests/auto/testlib/selftests/expected_cmptest.xml
tests/auto/testlib/selftests/expected_cmptest.xunitxml
tests/auto/testlib/selftests/tst_selftests.cpp

index 99b7700..47ec8cf 100644 (file)
@@ -59,6 +59,7 @@
 
 #include <QtWidgets/qicon.h>
 #include <QtGui/qpixmap.h>
+#include <QtGui/qimage.h>
 
 #if 0
 // inform syncqt
@@ -85,10 +86,71 @@ inline bool qCompare(QIcon const &t1, QIcon const &t2, const char *actual, const
 }
 #endif
 
+#ifndef QTEST_NO_SPECIALIZATIONS
 template<>
+#endif
+inline bool qCompare(QImage const &t1, QImage const &t2,
+                     const char *actual, const char *expected, const char *file, int line)
+{
+    char msg[1024];
+    msg[0] = '\0';
+    const bool t1Null = t1.isNull();
+    const bool t2Null = t2.isNull();
+    if (t1Null != t2Null) {
+        qsnprintf(msg, 1024, "Compared QImages differ.\n"
+                  "   Actual (%s).isNull()  : %d\n"
+                  "   Expected (%s).isNull(): %d", actual, t1Null, expected, t2Null);
+        return compare_helper(false, msg, file, line);
+    }
+    if (t1Null && t2Null)
+        return compare_helper(true, "COMPARE()", file, line);
+    if (t1.width() != t2.width() || t2.height() != t2.height()) {
+        qsnprintf(msg, 1024, "Compared QImages differ in size.\n"
+                  "   Actual (%s)  : %dx%d\n"
+                  "   Expected (%s): %dx%d",
+                  actual, t1.width(), t1.height(),
+                  expected, t2.width(), t2.height());
+        return compare_helper(false, msg, file, line);
+    }
+    if (t1.format() != t2.format()) {
+        qsnprintf(msg, 1024, "Compared QImages differ in format.\n"
+                  "   Actual (%s)  : %d\n"
+                  "   Expected (%s): %d",
+                  actual, t1.format(), expected, t2.format());
+        return compare_helper(false, msg, file, line);
+    }
+    return (t1 == t2)
+            ? compare_helper(true, "COMPARE()", file, line)
+            : compare_helper(false, "Compared values are not the same",
+                             toString(t1), toString(t2), actual, expected, file, line);
+}
+
+#ifndef QTEST_NO_SPECIALIZATIONS
+template<>
+#endif
 inline bool qCompare(QPixmap const &t1, QPixmap const &t2, const char *actual, const char *expected,
                     const char *file, int line)
 {
+    char msg[1024];
+    msg[0] = '\0';
+    const bool t1Null = t1.isNull();
+    const bool t2Null = t2.isNull();
+    if (t1Null != t2Null) {
+        qsnprintf(msg, 1024, "Compared QPixmaps differ.\n"
+                  "   Actual (%s).isNull()  : %d\n"
+                  "   Expected (%s).isNull(): %d", actual, t1Null, expected, t2Null);
+        return compare_helper(false, msg, file, line);
+    }
+    if (t1Null && t2Null)
+        return compare_helper(true, "COMPARE()", file, line);
+    if (t1.width() != t2.width() || t2.height() != t2.height()) {
+        qsnprintf(msg, 1024, "Compared QPixmaps differ in size.\n"
+                  "   Actual (%s)  : %dx%d\n"
+                  "   Expected (%s): %dx%d",
+                  actual, t1.width(), t1.height(),
+                  expected, t2.width(), t2.height());
+        return compare_helper(false, msg, file, line);
+    }
     return qCompare(t1.toImage(), t2.toImage(), actual, expected, file, line);
 }
 
index bc72f23..1da4646 100644 (file)
@@ -1,5 +1,5 @@
 SOURCES += tst_cmptest.cpp
-QT = core testlib
+QT = core gui testlib
 
 mac:CONFIG -= app_bundle
 CONFIG -= debug_and_release_target
index 6e19d60..f6773cc 100644 (file)
 
 #include <QtCore>
 #include <QtTest/QtTest>
+#include <QtGui/QImage>
+#include <QtGui/QPixmap>
+
+/* XPM test data for QPixmap, QImage tests (use drag cursors as example) */
+
+static const char * const xpmPixmapData1[] = {
+"11 20 3 1",
+".        c None",
+"a        c #FFFFFF",
+"X        c #000000", // X11 cursor is traditionally black
+"aa.........",
+"aXa........",
+"aXXa.......",
+"aXXXa......",
+"aXXXXa.....",
+"aXXXXXa....",
+"aXXXXXXa...",
+"aXXXXXXXa..",
+"aXXXXXXXXa.",
+"aXXXXXXXXXa",
+"aXXXXXXaaaa",
+"aXXXaXXa...",
+"aXXaaXXa...",
+"aXa..aXXa..",
+"aa...aXXa..",
+"a.....aXXa.",
+"......aXXa.",
+".......aXXa",
+".......aXXa",
+"........aa."};
+
+static const char * const xpmPixmapData2[] = {
+"11 20 4 1",
+".        c None",
+"a        c #FFFFFF",
+"b        c #0000FF",
+"X        c #000000",
+"aab........",
+"aXab.......",
+"aXXab......",
+"aXXXab.....",
+"aXXXXab....",
+"aXXXXXab...",
+"aXXXXXXab..",
+"aXXXXXXXa..",
+"aXXXXXXXXa.",
+"aXXXXXXXXXa",
+"aXXXXXXaaaa",
+"aXXXaXXa...",
+"aXXaaXXa...",
+"aXa..aXXa..",
+"aa...aXXa..",
+"a.....aXXa.",
+"......aXXa.",
+".......aXXa",
+".......aXXa",
+"........aa."};
+
+static const char * const xpmPixmapData3[] = {
+"20 20 2 1",
+"       c #000000",
+".      c #C32D2D",
+"          ..........",
+"            ........",
+"             .......",
+"              ......",
+"                ....",
+"                  ..",
+"                   .",
+"                    ",
+"                    ",
+".                   ",
+"...                 ",
+".....               ",
+"......              ",
+".......             ",
+".........           ",
+"...........         ",
+"...........         ",
+"............        ",
+"............        ",
+".............       "};
 
 class tst_Cmptest: public QObject
 {
@@ -54,6 +136,10 @@ private slots:
     void compare_tostring_data();
     void compareQStringLists();
     void compareQStringLists_data();
+    void compareQPixmaps();
+    void compareQPixmaps_data();
+    void compareQImages();
+    void compareQImages_data();
 };
 
 static bool boolfunc() { return true; }
@@ -222,5 +308,57 @@ void tst_Cmptest::compareQStringLists()
     QCOMPARE(opA, opB);
 }
 
+void tst_Cmptest::compareQPixmaps_data()
+{
+    QTest::addColumn<QPixmap>("opA");
+    QTest::addColumn<QPixmap>("opB");
+
+    const QPixmap pixmap1(xpmPixmapData1);
+    const QPixmap pixmap2(xpmPixmapData2);
+    const QPixmap pixmap3(xpmPixmapData3);
+
+    QTest::newRow("both null") << QPixmap() << QPixmap();
+    QTest::newRow("one null") << QPixmap() << pixmap1;
+    QTest::newRow("other null") << pixmap1 << QPixmap();
+    QTest::newRow("equal") << pixmap1 << pixmap1;
+    QTest::newRow("different size") << pixmap1 << pixmap3;
+    QTest::newRow("different pixels") << pixmap1 << pixmap2;
+}
+
+void tst_Cmptest::compareQPixmaps()
+{
+    QFETCH(QPixmap, opA);
+    QFETCH(QPixmap, opB);
+
+    QCOMPARE(opA, opB);
+}
+
+void tst_Cmptest::compareQImages_data()
+{
+    QTest::addColumn<QImage>("opA");
+    QTest::addColumn<QImage>("opB");
+
+    const QImage image1(QPixmap(xpmPixmapData1).toImage());
+    const QImage image2(QPixmap(xpmPixmapData2).toImage());
+    const QImage image1Indexed = image1.convertToFormat(QImage::Format_Indexed8);
+    const QImage image3(QPixmap(xpmPixmapData3).toImage());
+
+    QTest::newRow("both null") << QImage() << QImage();
+    QTest::newRow("one null") << QImage() << image1;
+    QTest::newRow("other null") << image1 << QImage();
+    QTest::newRow("equal") << image1 << image1;
+    QTest::newRow("different size") << image1 << image3;
+    QTest::newRow("different format") << image1 << image1Indexed;
+    QTest::newRow("different pixels") << image1 << image2;
+}
+
+void tst_Cmptest::compareQImages()
+{
+    QFETCH(QImage, opA);
+    QFETCH(QImage, opB);
+
+    QCOMPARE(opA, opB);
+}
+
 QTEST_MAIN(tst_Cmptest)
 #include "tst_cmptest.moc"
index d027dcd..17f3e6e 100644 (file)
 <Incident type="pass" file="" line="0" />
 </TestFunction>
 <TestFunction name="compare_tostring">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="122">
+<Incident type="fail" file="tst_cmptest.cpp" line="214">
     <DataTag><![CDATA[int, string]]></DataTag>
     <Description><![CDATA[Compared values are not the same
    Actual (actual): QVariant(int,123)
    Expected (expected): QVariant(QString,hi)]]></Description>
 </Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="122">
+<Incident type="fail" file="tst_cmptest.cpp" line="214">
     <DataTag><![CDATA[null hash, invalid]]></DataTag>
     <Description><![CDATA[Compared values are not the same
    Actual (actual): QVariant(QVariantHash)
    Expected (expected): QVariant()]]></Description>
 </Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="122">
+<Incident type="fail" file="tst_cmptest.cpp" line="214">
     <DataTag><![CDATA[string, null user type]]></DataTag>
     <Description><![CDATA[Compared values are not the same
    Actual (actual): QVariant(QString,A simple string)
    Expected (expected): QVariant(PhonyClass)]]></Description>
 </Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="122">
+<Incident type="fail" file="tst_cmptest.cpp" line="214">
     <DataTag><![CDATA[both non-null user type]]></DataTag>
     <Description><![CDATA[Compared values are not the same
    Actual (actual): QVariant(PhonyClass,<value not representable as string>)
 </Incident>
 </TestFunction>
 <TestFunction name="compareQStringLists">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="203">
+<Incident type="fail" file="tst_cmptest.cpp" line="308">
     <DataTag><![CDATA[last item different]]></DataTag>
     <Description><![CDATA[Compared QStringLists differ at index 2.
    Actual (opA) : 'string3'
    Expected (opB) : 'DIFFERS']]></Description>
 </Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="203">
+<Incident type="fail" file="tst_cmptest.cpp" line="308">
     <DataTag><![CDATA[second-last item different]]></DataTag>
     <Description><![CDATA[Compared QStringLists differ at index 2.
    Actual (opA) : 'string3'
    Expected (opB) : 'DIFFERS']]></Description>
 </Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="203">
+<Incident type="fail" file="tst_cmptest.cpp" line="308">
     <DataTag><![CDATA[prefix]]></DataTag>
     <Description><![CDATA[Compared QStringLists have different sizes.
    Actual (opA) size  : '2'
    Expected (opB) size: '1']]></Description>
 </Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="203">
+<Incident type="fail" file="tst_cmptest.cpp" line="308">
     <DataTag><![CDATA[short list second]]></DataTag>
     <Description><![CDATA[Compared QStringLists have different sizes.
    Actual (opA) size  : '12'
    Expected (opB) size: '1']]></Description>
 </Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="203">
+<Incident type="fail" file="tst_cmptest.cpp" line="308">
     <DataTag><![CDATA[short list first]]></DataTag>
     <Description><![CDATA[Compared QStringLists have different sizes.
    Actual (opA) size  : '1'
    Expected (opB) size: '12']]></Description>
 </Incident>
 </TestFunction>
+<TestFunction name="compareQPixmaps">
+<Incident type="fail" file="tst_cmptest.cpp" line="333">
+    <DataTag><![CDATA[one null]]></DataTag>
+    <Description><![CDATA[Compared QPixmaps differ.
+   Actual (opA).isNull()  : 1
+   Expected (opB).isNull(): 0]]></Description>
+</Incident>
+<Incident type="fail" file="tst_cmptest.cpp" line="333">
+    <DataTag><![CDATA[other null]]></DataTag>
+    <Description><![CDATA[Compared QPixmaps differ.
+   Actual (opA).isNull()  : 0
+   Expected (opB).isNull(): 1]]></Description>
+</Incident>
+<Incident type="fail" file="tst_cmptest.cpp" line="333">
+    <DataTag><![CDATA[different size]]></DataTag>
+    <Description><![CDATA[Compared QPixmaps differ in size.
+   Actual (opA)  : 11x20
+   Expected (opB): 20x20]]></Description>
+</Incident>
+<Incident type="fail" file="tst_cmptest.cpp" line="333">
+    <DataTag><![CDATA[different pixels]]></DataTag>
+    <Description><![CDATA[Compared values are not the same]]></Description>
+</Incident>
+</TestFunction>
+<TestFunction name="compareQImages">
+<Incident type="fail" file="tst_cmptest.cpp" line="360">
+    <DataTag><![CDATA[one null]]></DataTag>
+    <Description><![CDATA[Compared QImages differ.
+   Actual (opA).isNull()  : 1
+   Expected (opB).isNull(): 0]]></Description>
+</Incident>
+<Incident type="fail" file="tst_cmptest.cpp" line="360">
+    <DataTag><![CDATA[other null]]></DataTag>
+    <Description><![CDATA[Compared QImages differ.
+   Actual (opA).isNull()  : 0
+   Expected (opB).isNull(): 1]]></Description>
+</Incident>
+<Incident type="fail" file="tst_cmptest.cpp" line="360">
+    <DataTag><![CDATA[different size]]></DataTag>
+    <Description><![CDATA[Compared QImages differ in size.
+   Actual (opA)  : 11x20
+   Expected (opB): 20x20]]></Description>
+</Incident>
+<Incident type="fail" file="tst_cmptest.cpp" line="360">
+    <DataTag><![CDATA[different format]]></DataTag>
+    <Description><![CDATA[Compared QImages differ in format.
+   Actual (opA)  : 6
+   Expected (opB): 3]]></Description>
+</Incident>
+<Incident type="fail" file="tst_cmptest.cpp" line="360">
+    <DataTag><![CDATA[different pixels]]></DataTag>
+    <Description><![CDATA[Compared values are not the same]]></Description>
+</Incident>
+</TestFunction>
 <TestFunction name="cleanupTestCase">
 <Incident type="pass" file="" line="0" />
 </TestFunction>
index f7dc5cf..36a4995 100644 (file)
@@ -6,39 +6,71 @@ PASS   : tst_Cmptest::compare_pointerfuncs()
 FAIL!  : tst_Cmptest::compare_tostring(int, string) Compared values are not the same
    Actual (actual): QVariant(int,123)
    Expected (expected): QVariant(QString,hi)
-   Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(122)]
+   Loc: [tst_cmptest.cpp(214)]
 FAIL!  : tst_Cmptest::compare_tostring(null hash, invalid) Compared values are not the same
    Actual (actual): QVariant(QVariantHash)
    Expected (expected): QVariant()
-   Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(122)]
+   Loc: [tst_cmptest.cpp(214)]
 FAIL!  : tst_Cmptest::compare_tostring(string, null user type) Compared values are not the same
    Actual (actual): QVariant(QString,A simple string)
    Expected (expected): QVariant(PhonyClass)
-   Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(122)]
+   Loc: [tst_cmptest.cpp(214)]
 FAIL!  : tst_Cmptest::compare_tostring(both non-null user type) Compared values are not the same
    Actual (actual): QVariant(PhonyClass,<value not representable as string>)
    Expected (expected): QVariant(PhonyClass,<value not representable as string>)
-   Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(122)]
+   Loc: [tst_cmptest.cpp(214)]
 FAIL!  : tst_Cmptest::compareQStringLists(last item different) Compared QStringLists differ at index 2.
    Actual (opA) : 'string3'
    Expected (opB) : 'DIFFERS'
-   Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/alive/tst_alive.cpp(68)]
+   Loc: [tst_cmptest.cpp(308)]
 FAIL!  : tst_Cmptest::compareQStringLists(second-last item different) Compared QStringLists differ at index 2.
    Actual (opA) : 'string3'
    Expected (opB) : 'DIFFERS'
-   Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/alive/tst_alive.cpp(68)]
+   Loc: [tst_cmptest.cpp(308)]
 FAIL!  : tst_Cmptest::compareQStringLists(prefix) Compared QStringLists have different sizes.
    Actual (opA) size  : '2'
    Expected (opB) size: '1'
-   Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/alive/tst_alive.cpp(68)]
+   Loc: [tst_cmptest.cpp(308)]
 FAIL!  : tst_Cmptest::compareQStringLists(short list second) Compared QStringLists have different sizes.
    Actual (opA) size  : '12'
    Expected (opB) size: '1'
-   Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/alive/tst_alive.cpp(68)]
+   Loc: [tst_cmptest.cpp(308)]
 FAIL!  : tst_Cmptest::compareQStringLists(short list first) Compared QStringLists have different sizes.
    Actual (opA) size  : '1'
    Expected (opB) size: '12'
-   Loc: [/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/alive/tst_alive.cpp(68)]
+   Loc: [tst_cmptest.cpp(308)]
+FAIL!  : tst_Cmptest::compareQPixmaps(one null) Compared QPixmaps differ.
+   Actual (opA).isNull()  : 1
+   Expected (opB).isNull(): 0
+   Loc: [tst_cmptest.cpp(333)]
+FAIL!  : tst_Cmptest::compareQPixmaps(other null) Compared QPixmaps differ.
+   Actual (opA).isNull()  : 0
+   Expected (opB).isNull(): 1
+   Loc: [tst_cmptest.cpp(333)]
+FAIL!  : tst_Cmptest::compareQPixmaps(different size) Compared QPixmaps differ in size.
+   Actual (opA)  : 11x20
+   Expected (opB): 20x20
+   Loc: [tst_cmptest.cpp(333)]
+FAIL!  : tst_Cmptest::compareQPixmaps(different pixels) Compared values are not the same
+   Loc: [tst_cmptest.cpp(333)]
+FAIL!  : tst_Cmptest::compareQImages(one null) Compared QImages differ.
+   Actual (opA).isNull()  : 1
+   Expected (opB).isNull(): 0
+   Loc: [tst_cmptest.cpp(360)]
+FAIL!  : tst_Cmptest::compareQImages(other null) Compared QImages differ.
+   Actual (opA).isNull()  : 0
+   Expected (opB).isNull(): 1
+   Loc: [tst_cmptest.cpp(360)]
+FAIL!  : tst_Cmptest::compareQImages(different size) Compared QImages differ in size.
+   Actual (opA)  : 11x20
+   Expected (opB): 20x20
+   Loc: [tst_cmptest.cpp(360)]
+FAIL!  : tst_Cmptest::compareQImages(different format) Compared QImages differ in format.
+   Actual (opA)  : 6
+   Expected (opB): 3
+   Loc: [tst_cmptest.cpp(360)]
+FAIL!  : tst_Cmptest::compareQImages(different pixels) Compared values are not the same
+   Loc: [tst_cmptest.cpp(360)]
 PASS   : tst_Cmptest::cleanupTestCase()
-Totals: 4 passed, 9 failed, 0 skipped
+Totals: 4 passed, 18 failed, 0 skipped
 ********* Finished testing of tst_Cmptest *********
index 7faa3a9..aba1ce5 100644 (file)
 <Incident type="pass" file="" line="0" />
 </TestFunction>
 <TestFunction name="compare_tostring">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="122">
+<Incident type="fail" file="tst_cmptest.cpp" line="214">
     <DataTag><![CDATA[int, string]]></DataTag>
     <Description><![CDATA[Compared values are not the same
    Actual (actual): QVariant(int,123)
    Expected (expected): QVariant(QString,hi)]]></Description>
 </Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="122">
+<Incident type="fail" file="tst_cmptest.cpp" line="214">
     <DataTag><![CDATA[null hash, invalid]]></DataTag>
     <Description><![CDATA[Compared values are not the same
    Actual (actual): QVariant(QVariantHash)
    Expected (expected): QVariant()]]></Description>
 </Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="122">
+<Incident type="fail" file="tst_cmptest.cpp" line="214">
     <DataTag><![CDATA[string, null user type]]></DataTag>
     <Description><![CDATA[Compared values are not the same
    Actual (actual): QVariant(QString,A simple string)
    Expected (expected): QVariant(PhonyClass)]]></Description>
 </Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="122">
+<Incident type="fail" file="tst_cmptest.cpp" line="214">
     <DataTag><![CDATA[both non-null user type]]></DataTag>
     <Description><![CDATA[Compared values are not the same
    Actual (actual): QVariant(PhonyClass,<value not representable as string>)
 </Incident>
 </TestFunction>
 <TestFunction name="compareQStringLists">
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="203">
+<Incident type="fail" file="tst_cmptest.cpp" line="308">
     <DataTag><![CDATA[last item different]]></DataTag>
     <Description><![CDATA[Compared QStringLists differ at index 2.
    Actual (opA) : 'string3'
    Expected (opB) : 'DIFFERS']]></Description>
 </Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="203">
+<Incident type="fail" file="tst_cmptest.cpp" line="308">
     <DataTag><![CDATA[second-last item different]]></DataTag>
     <Description><![CDATA[Compared QStringLists differ at index 2.
    Actual (opA) : 'string3'
    Expected (opB) : 'DIFFERS']]></Description>
 </Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="203">
+<Incident type="fail" file="tst_cmptest.cpp" line="308">
     <DataTag><![CDATA[prefix]]></DataTag>
     <Description><![CDATA[Compared QStringLists have different sizes.
    Actual (opA) size  : '2'
    Expected (opB) size: '1']]></Description>
 </Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="203">
+<Incident type="fail" file="tst_cmptest.cpp" line="308">
     <DataTag><![CDATA[short list second]]></DataTag>
     <Description><![CDATA[Compared QStringLists have different sizes.
    Actual (opA) size  : '12'
    Expected (opB) size: '1']]></Description>
 </Incident>
-<Incident type="fail" file="/home/user/dev/qt5/qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="203">
+<Incident type="fail" file="tst_cmptest.cpp" line="308">
     <DataTag><![CDATA[short list first]]></DataTag>
     <Description><![CDATA[Compared QStringLists have different sizes.
    Actual (opA) size  : '1'
    Expected (opB) size: '12']]></Description>
 </Incident>
 </TestFunction>
+<TestFunction name="compareQPixmaps">
+<Incident type="fail" file="tst_cmptest.cpp" line="333">
+    <DataTag><![CDATA[one null]]></DataTag>
+    <Description><![CDATA[Compared QPixmaps differ.
+   Actual (opA).isNull()  : 1
+   Expected (opB).isNull(): 0]]></Description>
+</Incident>
+<Incident type="fail" file="tst_cmptest.cpp" line="333">
+    <DataTag><![CDATA[other null]]></DataTag>
+    <Description><![CDATA[Compared QPixmaps differ.
+   Actual (opA).isNull()  : 0
+   Expected (opB).isNull(): 1]]></Description>
+</Incident>
+<Incident type="fail" file="tst_cmptest.cpp" line="333">
+    <DataTag><![CDATA[different size]]></DataTag>
+    <Description><![CDATA[Compared QPixmaps differ in size.
+   Actual (opA)  : 11x20
+   Expected (opB): 20x20]]></Description>
+</Incident>
+<Incident type="fail" file="tst_cmptest.cpp" line="333">
+    <DataTag><![CDATA[different pixels]]></DataTag>
+    <Description><![CDATA[Compared values are not the same]]></Description>
+</Incident>
+</TestFunction>
+<TestFunction name="compareQImages">
+<Incident type="fail" file="tst_cmptest.cpp" line="360">
+    <DataTag><![CDATA[one null]]></DataTag>
+    <Description><![CDATA[Compared QImages differ.
+   Actual (opA).isNull()  : 1
+   Expected (opB).isNull(): 0]]></Description>
+</Incident>
+<Incident type="fail" file="tst_cmptest.cpp" line="360">
+    <DataTag><![CDATA[other null]]></DataTag>
+    <Description><![CDATA[Compared QImages differ.
+   Actual (opA).isNull()  : 0
+   Expected (opB).isNull(): 1]]></Description>
+</Incident>
+<Incident type="fail" file="tst_cmptest.cpp" line="360">
+    <DataTag><![CDATA[different size]]></DataTag>
+    <Description><![CDATA[Compared QImages differ in size.
+   Actual (opA)  : 11x20
+   Expected (opB): 20x20]]></Description>
+</Incident>
+<Incident type="fail" file="tst_cmptest.cpp" line="360">
+    <DataTag><![CDATA[different format]]></DataTag>
+    <Description><![CDATA[Compared QImages differ in format.
+   Actual (opA)  : 6
+   Expected (opB): 3]]></Description>
+</Incident>
+<Incident type="fail" file="tst_cmptest.cpp" line="360">
+    <DataTag><![CDATA[different pixels]]></DataTag>
+    <Description><![CDATA[Compared values are not the same]]></Description>
+</Incident>
+</TestFunction>
 <TestFunction name="cleanupTestCase">
 <Incident type="pass" file="" line="0" />
 </TestFunction>
index aa765a6..00f5f7f 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<testsuite errors="0" failures="9" tests="6" name="tst_Cmptest">
+<testsuite errors="0" failures="18" tests="8" name="tst_Cmptest">
   <properties>
     <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
     <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
    Actual (opA) size  : &apos;1&apos;
    Expected (opB) size: &apos;12&apos;" result="fail"/>
   </testcase>
+  <testcase result="fail" name="compareQPixmaps">
+    <failure tag="one null" message="Compared QPixmaps differ.
+   Actual (opA).isNull()  : 1
+   Expected (opB).isNull(): 0" result="fail"/>
+    <failure tag="other null" message="Compared QPixmaps differ.
+   Actual (opA).isNull()  : 0
+   Expected (opB).isNull(): 1" result="fail"/>
+    <failure tag="different size" message="Compared QPixmaps differ in size.
+   Actual (opA)  : 11x20
+   Expected (opB): 20x20" result="fail"/>
+    <failure tag="different pixels" message="Compared values are not the same" result="fail"/>
+  </testcase>
+  <testcase result="fail" name="compareQImages">
+    <failure tag="one null" message="Compared QImages differ.
+   Actual (opA).isNull()  : 1
+   Expected (opB).isNull(): 0" result="fail"/>
+    <failure tag="other null" message="Compared QImages differ.
+   Actual (opA).isNull()  : 0
+   Expected (opB).isNull(): 1" result="fail"/>
+    <failure tag="different size" message="Compared QImages differ in size.
+   Actual (opA)  : 11x20
+   Expected (opB): 20x20" result="fail"/>
+    <failure tag="different format" message="Compared QImages differ in format.
+   Actual (opA)  : 6
+   Expected (opB): 3" result="fail"/>
+    <failure tag="different pixels" message="Compared values are not the same" result="fail"/>
+  </testcase>
   <testcase result="pass" name="cleanupTestCase"/>
   <system-err/>
 </testsuite>
index ea47678..7825ade 100644 (file)
@@ -445,7 +445,15 @@ static inline QProcessEnvironment processEnvironment()
 {
     QProcessEnvironment result;
     const QString path = QStringLiteral("PATH");
-    result.insert(path, QProcessEnvironment::systemEnvironment().value(path));
+    const QProcessEnvironment systemEnvironment = QProcessEnvironment::systemEnvironment();
+    result.insert(path, systemEnvironment.value(path));
+    // Preserve DISPLAY for X11 as some tests use QtGui.
+#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
+    const QString display = QStringLiteral("DISPLAY");
+    const QString displayValue = systemEnvironment.value(display);
+    if (!displayValue.isEmpty())
+        result.insert(display, displayValue);
+#endif
     return result;
 }
 
@@ -486,6 +494,7 @@ void tst_Selftests::doRunSubTest(QString const& subdir, QStringList const& logge
     // newer than the valgrind version, such that valgrind can't understand the
     // debug information on the binary.
     if (subdir != QLatin1String("exceptionthrow")
+        && subdir != QLatin1String("cmptest") // QImage comparison requires QGuiApplication
         && subdir != QLatin1String("fetchbogus")
         && subdir != QLatin1String("xunit")
         && subdir != QLatin1String("benchlibcallgrind"))
@@ -524,7 +533,9 @@ void tst_Selftests::doRunSubTest(QString const& subdir, QStringList const& logge
                 }
             }
         } else {
-            QCOMPARE(res.count(), exp.count());
+            QVERIFY2(res.count() == exp.count(),
+                     qPrintable(QString::fromLatin1("Mismatch in line count: %1 != %2 (%3).")
+                                .arg(res.count()).arg(exp.count()).arg(loggers.at(n))));
         }
 
         // For xml output formats, verify that the log is valid XML.
@@ -585,7 +596,9 @@ void tst_Selftests::doRunSubTest(QString const& subdir, QStringList const& logge
 
                 QCOMPARE(actualResult, expectedResult);
             } else {
-                QCOMPARE(output, expected);
+                QVERIFY2(output == expected,
+                         qPrintable(QString::fromLatin1("Mismatch at line %1 (%2): '%3' != '%4'")
+                                    .arg(i).arg(loggers.at(n), output, expected)));
             }
 
             benchmark = line.startsWith("RESULT : ");
@@ -758,9 +771,12 @@ void tst_Selftests::cleanup()
 
     // Remove the test output files
     for (int i = 0; i < loggers.count(); ++i) {
-        QString logFile = logName(loggers[i]);
-        if (!logFile.isEmpty())
-            QVERIFY(QFile::remove(logFile));
+        QString logFileName = logName(loggers[i]);
+        if (!logFileName.isEmpty()) {
+            QFile logFile(logFileName);
+            if (logFile.exists())
+                QVERIFY2(logFile.remove(), qPrintable(QString::fromLatin1("Cannot remove file '%1': %2: ").arg(logFileName, logFile.errorString())));
+        }
     }
 }