tests/auto/qimagereader/tst_qimagereader.cpp
changeset 7 f7bc934e204c
parent 3 41300fa6a67c
child 30 5dc02b23752f
--- a/tests/auto/qimagereader/tst_qimagereader.cpp	Tue Feb 02 00:43:10 2010 +0200
+++ b/tests/auto/qimagereader/tst_qimagereader.cpp	Wed Mar 31 11:06:36 2010 +0300
@@ -1,6 +1,6 @@
 /****************************************************************************
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
 ** All rights reserved.
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
@@ -141,6 +141,8 @@
 #if defined QTEST_HAVE_GIF
     void gifHandlerBugs();
     void animatedGif();
+    void gifImageCount();
+    void gifLoopCount();
 #endif
 
     void readCorruptImage_data();
@@ -322,7 +324,15 @@
     QTest::newRow("PPM: test") << "test.ppm" << QSize(10, 10) << QByteArray("ppm");
     QTest::newRow("XBM: gnus") << "gnus" << QSize(200, 200) << QByteArray("xbm");
 #ifdef QTEST_HAVE_JPEG
-    QTest::newRow("JPEG: beavis") << "beavis" << QSize(200, 200) << QByteArray("jpeg");
+    QTest::newRow("JPEG: beavis A") << "beavis" << QSize(200, 200) << QByteArray("jpeg");
+    QTest::newRow("JPEG: beavis B") << "beavis" << QSize(175, 175) << QByteArray("jpeg");
+    QTest::newRow("JPEG: beavis C") << "beavis" << QSize(100, 100) << QByteArray("jpeg");
+    QTest::newRow("JPEG: beavis D") << "beavis" << QSize(100, 200) << QByteArray("jpeg");
+    QTest::newRow("JPEG: beavis E") << "beavis" << QSize(200, 100) << QByteArray("jpeg");
+    QTest::newRow("JPEG: beavis F") << "beavis" << QSize(87, 87) << QByteArray("jpeg");
+    QTest::newRow("JPEG: beavis G") << "beavis" << QSize(50, 45) << QByteArray("jpeg");
+    QTest::newRow("JPEG: beavis H") << "beavis" << QSize(43, 43) << QByteArray("jpeg");
+    QTest::newRow("JPEG: beavis I") << "beavis" << QSize(25, 25) << QByteArray("jpeg");
 #endif // QTEST_HAVE_JPEG
 #ifdef QTEST_HAVE_GIF
     QTest::newRow("GIF: earth") << "earth" << QSize(200, 200) << QByteArray("gif");
@@ -717,6 +727,13 @@
         QVERIFY(!im1.isNull());  QVERIFY(!im2.isNull());
         QCOMPARE(im1.convertToFormat(QImage::Format_ARGB32), im2.convertToFormat(QImage::Format_ARGB32));
     }
+
+    // Check the undocumented feature.
+    {
+        QImageReader io(prefix + "endless-anim.gif");
+        QVERIFY(io.canRead());
+        QCOMPARE(io.loopCount(), -1);
+    }
 }
 
 void tst_QImageReader::animatedGif()
@@ -731,6 +748,156 @@
         image = io.read();
     }
 }
+
+// http://bugreports.qt.nokia.com/browse/QTBUG-6696
+// Check the count of images in various call orders...
+void tst_QImageReader::gifImageCount()
+{
+    // just read every frame... and see how much we got..
+    {
+        QImageReader io(":images/four-frames.gif");
+
+        QVERIFY(io.canRead());
+        QImage blackFrame = io.read();
+
+        QVERIFY(io.canRead());
+        QImage whiteFrame = io.read();
+
+        QVERIFY(io.canRead());
+        QImage greenFrame = io.read();
+
+        QVERIFY(io.imageCount() == 4);
+
+        QVERIFY(io.canRead());
+        QImage blueFrame = io.read();
+
+        QVERIFY(!io.canRead());
+        QImage emptyFrame = io.read();
+
+        QVERIFY(!io.canRead());
+        QCOMPARE(blackFrame.pixel(0,0), qRgb(0, 0, 0));
+        QCOMPARE(blackFrame.size(), QSize(64,64));
+
+        QCOMPARE(whiteFrame.pixel(0,0), qRgb(0xff, 0xff, 0xff));
+        QCOMPARE(whiteFrame.size(), QSize(64,64));
+
+        QCOMPARE(greenFrame.pixel(0,0), qRgb(0x0, 0xff, 0x0));
+        QCOMPARE(greenFrame.size(), QSize(64,64));
+
+        QCOMPARE(blueFrame.pixel(0,0), qRgb(0x0, 0x0, 0xff));
+        QCOMPARE(blueFrame.size(), QSize(64,64));
+        QVERIFY(emptyFrame.isNull());
+    }
+
+    // Read and get the size
+    {
+        QImageReader io(":images/four-frames.gif");
+
+        QVERIFY(io.canRead());
+        QCOMPARE(io.size(), QSize(64,64));
+
+        QVERIFY(io.canRead());
+        QCOMPARE(io.size(), QSize(64,64));
+        QCOMPARE(io.size(), QSize(64,64));
+        QVERIFY(io.canRead());
+        QImage blackFrame = io.read();
+
+        QVERIFY(io.canRead());
+        QCOMPARE(io.size(), QSize(64,64));
+        QCOMPARE(io.size(), QSize(64,64));
+        QVERIFY(io.canRead());
+        QImage whiteFrame = io.read();
+
+        QVERIFY(io.canRead());
+        QCOMPARE(io.size(), QSize(64,64));
+        QCOMPARE(io.size(), QSize(64,64));
+        QVERIFY(io.canRead());
+        QImage greenFrame = io.read();
+
+        QVERIFY(io.canRead());
+        QCOMPARE(io.size(), QSize(64,64));
+        QCOMPARE(io.size(), QSize(64,64));
+        QVERIFY(io.canRead());
+        QImage blueFrame = io.read();
+
+        QVERIFY(!io.canRead());
+        QCOMPARE(io.size(), QSize());
+        QCOMPARE(io.size(), QSize());
+        QVERIFY(!io.canRead());
+        QImage emptyFrame = io.read();
+
+        QVERIFY(!io.canRead());
+        QCOMPARE(blackFrame.pixel(0,0), qRgb(0, 0, 0));
+        QCOMPARE(blackFrame.size(), QSize(64,64));
+
+        QCOMPARE(whiteFrame.pixel(0,0), qRgb(0xff, 0xff, 0xff));
+        QCOMPARE(whiteFrame.size(), QSize(64,64));
+
+        QCOMPARE(greenFrame.pixel(0,0), qRgb(0x0, 0xff, 0x0));
+        QCOMPARE(greenFrame.size(), QSize(64,64));
+
+        QCOMPARE(blueFrame.pixel(0,0), qRgb(0x0, 0x0, 0xff));
+        QCOMPARE(blueFrame.size(), QSize(64,64));
+        QVERIFY(emptyFrame.isNull());
+    }
+
+    // Do a Size query as substitute for canRead
+    {
+        QImageReader io(":images/four-frames.gif");
+
+        QCOMPARE(io.size(), QSize(64,64));
+        QCOMPARE(io.size(), QSize(64,64));
+        QImage blackFrame = io.read();
+
+        QCOMPARE(io.size(), QSize(64,64));
+        QCOMPARE(io.size(), QSize(64,64));
+        QImage whiteFrame = io.read();
+
+        QCOMPARE(io.size(), QSize(64,64));
+        QCOMPARE(io.size(), QSize(64,64));
+        QImage greenFrame = io.read();
+
+        QCOMPARE(io.size(), QSize(64,64));
+        QCOMPARE(io.size(), QSize(64,64));
+        QImage blueFrame = io.read();
+
+        QCOMPARE(io.size(), QSize());
+        QVERIFY(!io.canRead());
+        QImage emptyFrame = io.read();
+
+        QVERIFY(!io.canRead());
+        QCOMPARE(blackFrame.pixel(0,0), qRgb(0, 0, 0));
+        QCOMPARE(blackFrame.size(), QSize(64,64));
+
+        QCOMPARE(whiteFrame.pixel(0,0), qRgb(0xff, 0xff, 0xff));
+        QCOMPARE(whiteFrame.size(), QSize(64,64));
+
+        QCOMPARE(greenFrame.pixel(0,0), qRgb(0x0, 0xff, 0x0));
+        QCOMPARE(greenFrame.size(), QSize(64,64));
+
+        QCOMPARE(blueFrame.pixel(0,0), qRgb(0x0, 0x0, 0xff));
+        QCOMPARE(blueFrame.size(), QSize(64,64));
+        QVERIFY(emptyFrame.isNull());
+    }
+    {
+        QImageReader io(":images/trolltech.gif");
+        QVERIFY(io.imageCount() == 34);
+        QVERIFY(io.size() == QSize(128,64));
+    }
+}
+
+void tst_QImageReader::gifLoopCount()
+{
+    {
+        QImageReader io(":images/qt-gif-anim.gif");
+        QCOMPARE(io.loopCount(), -1); // infinite loop
+    }
+    {
+        QImageReader io(":images/qt-gif-noanim.gif");
+        QCOMPARE(io.loopCount(), 0); // no loop
+    }
+}
+
 #endif
 
 class Server : public QObject
@@ -1466,6 +1633,35 @@
         QVERIFY(reader.canRead());
         QVERIFY(!reader.read().isNull());
     }
+
+#ifdef QTEST_HAVE_JPEG
+    {
+        QImageReader io(prefix + "YCbCr_rgb.jpg");
+        io.setAutoDetectImageFormat(false);
+        // This should fail since no format string is given
+        QImage image;
+        QVERIFY(!io.read(&image));
+    }
+    {
+        QImageReader io(prefix + "YCbCr_rgb.jpg", "jpg");
+        io.setAutoDetectImageFormat(false);
+        QImage image;
+        QVERIFY(io.read(&image));
+    }
+#endif
+    {
+        QImageReader io(prefix + "tst7.png");
+        io.setAutoDetectImageFormat(false);
+        // This should fail since no format string is given
+        QImage image;
+        QVERIFY(!io.read(&image));
+    }
+    {
+        QImageReader io(prefix + "tst7.png", "png");
+        io.setAutoDetectImageFormat(false);
+        QImage image;
+        QVERIFY(io.read(&image));
+    }
 }
 
 void tst_QImageReader::fileNameProbing()
@@ -1487,24 +1683,44 @@
 
     QTest::newRow("floppy (16px,32px - 16 colors)") << "35floppy.ico";
     QTest::newRow("semitransparent") << "semitransparent.ico";
-    QTest::newRow("slightlybroken") << "kde_favicon.ico";
+    QTest::newRow("slightlybrokenBMPHeader") << "kde_favicon.ico";
+    QTest::newRow("sightlybrokenIconHeader") << "connect.ico";
 }
 
 void tst_QImageReader::pixelCompareWithBaseline()
 {
     QFETCH(QString, fileName);
 
+    static int enteredCount = 0;    // Used for better error diagnostics if something fails. We
+    static int loadFailCount = 0;   // don't know if the reason load() fails is that the plugin
+                                    // does not exist or because of a bug in the plugin. But if at
+                                    // least one file succeeded we know that the plugin was built.
+                                    // The other failures are then real failures.
     QImage icoImg;
+    const QString inputFileName(QString::fromAscii("images/%1").arg(fileName));
+    QFileInfo fi(inputFileName);
+
+    ++enteredCount;
     // might fail if the plugin does not exist, which is ok.
-    if (icoImg.load(QString::fromAscii("images/%1").arg(fileName))) {
-        QString baselineFileName = QString::fromAscii("baseline/%1").arg(fileName);
+    if (icoImg.load(inputFileName)) {
+        icoImg = icoImg.convertToFormat(QImage::Format_ARGB32_Premultiplied);
+        const QString baselineFileName(QString::fromAscii("baseline/%1.png").arg(fi.baseName()));
 #if 0
         icoImg.save(baselineFileName);
 #else
         QImage baseImg;
         QVERIFY(baseImg.load(baselineFileName));
+        baseImg = baseImg.convertToFormat(QImage::Format_ARGB32_Premultiplied);
+        QCOMPARE(int(baseImg.format()), int(icoImg.format()));
         QCOMPARE(baseImg, icoImg);
 #endif
+    } else {
+        ++loadFailCount;
+        if (enteredCount != loadFailCount) {
+            QFAIL("Plugin is built, but some did not load properly");
+        } else {
+            qWarning("loading failed, check if ico plugin is built");
+        }
     }
 }