// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include #include #include #include #include #include #include #include #include "pluginlog.h" class tst_QImageIOHandler : public QObject { Q_OBJECT public: tst_QImageIOHandler(); virtual ~tst_QImageIOHandler(); static void initMain() { QHashSeed::setDeterministicGlobalSeed(); } private slots: void getSetCheck(); void hasCustomPluginFormat(); void pluginRead_data(); void pluginRead(); void pluginNoAutoDetection_data(); void pluginNoAutoDetection(); void pluginDecideFromContent_data(); void pluginDecideFromContent(); void pluginDetectedFormat_data(); void pluginDetectedFormat(); void pluginWrongFormat_data(); void pluginWrongFormat(); private: QString m_prefix; QList m_supportedReadFormats; bool m_testPluginFoundLast = false; }; class MyImageIOHandler : public QImageIOHandler { public: MyImageIOHandler() : QImageIOHandler() { } bool canRead() const override { return true; } bool read(QImage *) override { return true; } }; tst_QImageIOHandler::tst_QImageIOHandler() { m_prefix = QFINDTESTDATA("images/"); m_supportedReadFormats = QImageReader::supportedImageFormats(); m_testPluginFoundLast = QLibraryInfo::isSharedBuild(); } tst_QImageIOHandler::~tst_QImageIOHandler() { } // Testing get/set functions void tst_QImageIOHandler::getSetCheck() { MyImageIOHandler obj1; // QIODevice * QImageIOHandler::device() // void QImageIOHandler::setDevice(QIODevice *) QFile *var1 = new QFile; obj1.setDevice(var1); QCOMPARE(obj1.device(), (QIODevice *)var1); obj1.setDevice((QIODevice *)0); QCOMPARE(obj1.device(), (QIODevice *)0); delete var1; } Q_IMPORT_PLUGIN(TestImagePlugin) void tst_QImageIOHandler::hasCustomPluginFormat() { QVERIFY(m_supportedReadFormats.contains("foo")); } void tst_QImageIOHandler::pluginRead_data() { QTest::addColumn("color"); QTest::addColumn("suffix"); QTest::addColumn("expectedPluginLog"); QTest::newRow("testplugin") << "green" << "foo" << QStringList({ "formatname-matched" }); QTest::newRow("overridden-builtin") << "red" << "png" << QStringList({ "formatname-matched" }); QTest::newRow("builtin") << "black" << "bmp" << QStringList({ "formatname-unmatched" }); //### Should be null QTest::newRow("no-suffix") << "blue" << "" << QStringList({ "contents-matched" }); QTest::newRow("wrong-suffix") << "yellow" << "jpg" << QStringList({ "contents-matched" }); QTest::newRow("unknown-suffix") << "black" << "bar" << QStringList({ "formatname-unmatched", "contents-unmatched" }); if (m_supportedReadFormats.contains("jpeg")) QTest::newRow("wrong-suffix2") << "white" << "foo" << QStringList({ "formatname-matched" }); if (m_supportedReadFormats.contains("gif")) { if (m_testPluginFoundLast) QTest::newRow("plugin-writeonly") << "cyan" << "gif" << QStringList(); else QTest::newRow("plugin-writeonly") << "cyan" << "gif" << QStringList({ "formatname-matched" }); } } void tst_QImageIOHandler::pluginRead() { QFETCH(QString, color); QFETCH(QString, suffix); QFETCH(QStringList, expectedPluginLog); PluginLog::clear(); QString filePath = m_prefix + color + (suffix.isEmpty() ? "" : "." + suffix); QImage img(filePath); QCOMPARE(PluginLog::size(), expectedPluginLog.size()); for (int i = 0; i < PluginLog::size(); i++) QCOMPARE(PluginLog::item(i), expectedPluginLog.value(i)); QVERIFY(!img.isNull()); QCOMPARE(img.pixelColor(0, 0), QColor(color)); } void tst_QImageIOHandler::pluginNoAutoDetection_data() { QTest::addColumn("color"); QTest::addColumn("suffix"); QTest::addColumn("expectedPluginLog"); QTest::addColumn("expectedSuccess"); QTest::newRow("testplugin") << "green" << "foo" << QStringList({ "formatname-matched" }) << true; QTest::newRow("overridden-builtin") << "red" << "png" << QStringList({ "formatname-matched" }) << true; QTest::newRow("builtin") << "black" << "bmp" << QStringList() << true; QTest::newRow("no-suffix") << "blue" << "" << QStringList() << false; QTest::newRow("wrong-suffix") << "yellow" << "jpg" << QStringList() << false; QTest::newRow("unknown-suffix") << "black" << "bar" << QStringList() << false; QTest::newRow("wrong-suffix2") << "white" << "foo" << QStringList({ "formatname-matched" }) << false; if (m_supportedReadFormats.contains("gif")) { if (m_testPluginFoundLast) QTest::newRow("plugin-writeonly") << "cyan" << "gif" << QStringList() << true; else QTest::newRow("plugin-writeonly") << "cyan" << "gif" << QStringList({ "formatname-matched" }) << true; } } void tst_QImageIOHandler::pluginNoAutoDetection() { QFETCH(QString, color); QFETCH(QString, suffix); QFETCH(QStringList, expectedPluginLog); QFETCH(bool, expectedSuccess); QString filePath = m_prefix + color + (suffix.isEmpty() ? "" : "." + suffix); { // Confirm that the file suffix is ignored, i.e. nothing happens if no format is set PluginLog::clear(); QImageReader r(filePath); r.setAutoDetectImageFormat(false); QImage img = r.read(); QVERIFY(img.isNull()); QCOMPARE(PluginLog::size(), 0); } PluginLog::clear(); QImageReader r(filePath, suffix.toLatin1()); r.setAutoDetectImageFormat(false); QImage img = r.read(); QCOMPARE(PluginLog::size(), expectedPluginLog.size()); for (int i = 0; i < PluginLog::size(); i++) QCOMPARE(PluginLog::item(i), expectedPluginLog.value(i)); QCOMPARE(!img.isNull(), expectedSuccess); if (expectedSuccess) QCOMPARE(img.pixelColor(0, 0), QColor(color)); } void tst_QImageIOHandler::pluginDecideFromContent_data() { QTest::addColumn("color"); QTest::addColumn("suffix"); QTest::addColumn("expectedPluginLog"); QTest::newRow("testplugin") << "green" << "foo" << QStringList({ "contents-matched" }); QTest::newRow("overridden-builtin") << "red" << "png" << QStringList({ "contents-matched" }); QTest::newRow("builtin") << "black" << "bmp" << QStringList({ "contents-unmatched" }); QTest::newRow("no-suffix") << "blue" << "" << QStringList({ "contents-matched" }); QTest::newRow("wrong-suffix") << "yellow" << "jpg" << QStringList({ "contents-matched" }); QTest::newRow("unknown-suffix") << "black" << "bar" << QStringList({ "contents-unmatched" }); if (m_supportedReadFormats.contains("jpeg")) { if (m_testPluginFoundLast) QTest::newRow("wrong-suffix2") << "white" << "foo" << QStringList(); else QTest::newRow("wrong-suffix2") << "white" << "foo" << QStringList({ "contents-unmatched" }); } } void tst_QImageIOHandler::pluginDecideFromContent() { QFETCH(QString, color); QFETCH(QString, suffix); QFETCH(QStringList, expectedPluginLog); QString filePath = m_prefix + color + (suffix.isEmpty() ? "" : "." + suffix); PluginLog::clear(); QImageReader r(filePath, suffix.toLatin1()); r.setDecideFormatFromContent(true); QImage img = r.read(); QCOMPARE(PluginLog::size(), expectedPluginLog.size()); for (int i = 0; i < PluginLog::size(); i++) QCOMPARE(PluginLog::item(i), expectedPluginLog.value(i)); QVERIFY(!img.isNull()); QCOMPARE(img.pixelColor(0, 0), QColor(color)); } void tst_QImageIOHandler::pluginDetectedFormat_data() { QTest::addColumn("color"); QTest::addColumn("suffix"); QTest::addColumn("fileFormat"); QTest::newRow("testplugin") << "green" << "foo" << "foo"; QTest::newRow("overridden-builtin") << "red" << "png" << "png"; QTest::newRow("builtin") << "black" << "bmp" << "bmp"; QTest::newRow("no-suffix") << "blue" << "" << "png"; QTest::newRow("wrong-suffix") << "yellow" << "jpg" << "foo"; QTest::newRow("unknown-suffix") << "black" << "bar" << "bmp"; if (m_supportedReadFormats.contains("jpeg")) QTest::newRow("wrong-suffix2") << "white" << "foo" << "jpeg"; if (m_supportedReadFormats.contains("gif")) QTest::newRow("plugin-writeonly") << "cyan" << "gif" << "gif"; } void tst_QImageIOHandler::pluginDetectedFormat() { QFETCH(QString, color); QFETCH(QString, suffix); QFETCH(QString, fileFormat); QString filePath = m_prefix + color + (suffix.isEmpty() ? "" : "." + suffix); QCOMPARE(QImageReader::imageFormat(filePath), fileFormat.toLatin1()); } void tst_QImageIOHandler::pluginWrongFormat_data() { QTest::addColumn("color"); QTest::addColumn("suffix"); QTest::addColumn("forceFormat"); QTest::newRow("testplugin") << "green" << "foo" << "bmp"; QTest::newRow("overridden-builtin") << "red" << "png" << "bmp"; QTest::newRow("builtin") << "black" << "bmp" << "foo"; QTest::newRow("no-suffix") << "blue" << "" << "bmp"; QTest::newRow("wrong-suffix") << "yellow" << "jpg" << "bmp"; QTest::newRow("unknown-suffix") << "black" << "bar" << "foo"; QTest::newRow("wrong-suffix2") << "white" << "foo" << "bmp"; } void tst_QImageIOHandler::pluginWrongFormat() { QFETCH(QString, color); QFETCH(QString, suffix); QFETCH(QString, forceFormat); PluginLog::clear(); QString filePath = m_prefix + color + (suffix.isEmpty() ? "" : "." + suffix); QImage img(filePath, forceFormat.toLatin1()); QVERIFY(img.isNull()); } QTEST_MAIN(tst_QImageIOHandler) #include "tst_qimageiohandler.moc"