diff --git a/autotests/epubextractortest.cpp b/autotests/epubextractortest.cpp --- a/autotests/epubextractortest.cpp +++ b/autotests/epubextractortest.cpp @@ -50,13 +50,29 @@ QCOMPARE(result.properties().value(Property::Author), QVariant(QStringLiteral("Happy Man"))); QCOMPARE(result.properties().value(Property::Publisher), QVariant(QStringLiteral("Happy Publisher"))); QCOMPARE(result.properties().value(Property::Title), QVariant(QStringLiteral("The Big Brown Bear"))); - QCOMPARE(result.properties().value(Property::Subject), QVariant(QStringLiteral("Baloo KFileMetaData"))); + QCOMPARE(result.properties().value(Property::Subject), QVariant(QStringLiteral("Baloo KFile Meta Data"))); + const QList expectedValues = { + QStringLiteral("Data"), + QStringLiteral("Meta"), + QStringLiteral("KFile"), + QStringLiteral("Baloo"), + }; + QCOMPARE(result.properties().values(Property::Keywords), expectedValues); + + const QList expectedOrder = { + QStringLiteral("Baloo"), + QStringLiteral("KFile"), + QStringLiteral("Meta"), + QStringLiteral("Data"), + }; + QEXPECT_FAIL("", "Order not preserved", Continue); + QCOMPARE(result.properties().values(Property::Keywords), expectedOrder); QDateTime dt(QDate(2014, 1, 1), QTime(1, 1, 1)); dt.setTimeSpec(Qt::UTC); QCOMPARE(result.properties().value(Property::CreationDate), QVariant(dt)); - QCOMPARE(result.properties().size(), 5); + QCOMPARE(result.properties().size(), 9); } void EPubExtractorTest::testMetaDataOnly() diff --git a/autotests/multivaluetest.cpp b/autotests/multivaluetest.cpp --- a/autotests/multivaluetest.cpp +++ b/autotests/multivaluetest.cpp @@ -97,23 +97,23 @@ << QStringLiteral("application/epub+zip") << Property::Subject << QVariantList{} - << QStringLiteral("Subject should not be valid when there is more than one") + << QString() ; // Always provide Property::Keywords QTest::newRow("epub/1 keyword") << QFINDTESTDATA("samplefiles/test.epub") << QStringLiteral("application/epub+zip") << property << QVariantList{QVariant(QStringLiteral("Baloo KFileMetaData"))} - << QStringLiteral("keywords not implemented") + << QString() ; QTest::newRow("epub/keywords") << QFINDTESTDATA("samplefiles/multi/test.epub") << QStringLiteral("application/epub+zip") << property << expectedResult - << QStringLiteral("keywords not implemented") + << QString() ; diff --git a/autotests/samplefiles/test.epub b/autotests/samplefiles/test.epub index cc7cfad9384c0d4a47dcf5f68cade7e409699e06..6ea133454174fb2ac67eeca9f21178b06a1beb44 GIT binary patch literal 5111 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 literal 5107 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 iKK|3&ck6?KaddType(Type::Document); - QString value = fetchMetadata(ePubDoc, EPUB_TITLE); + QString value = fetchMetadataString(ePubDoc, EPUB_TITLE); if (!value.isEmpty()) { result->add(Property::Title, value); } - value = fetchMetadata(ePubDoc, EPUB_SUBJECT); - if (!value.isEmpty()) { - result->add(Property::Subject, value); + QStringList values = fetchMetadata(ePubDoc, EPUB_SUBJECT); + if (values.size() > 1) { + for (const auto& value : values) { + result->add(Property::Keywords, value); + } + } else if (values.size() == 1) { + result->add(Property::Keywords, values[0]); + result->add(Property::Subject, values[0]); } - value = fetchMetadata(ePubDoc, EPUB_CREATOR); + value = fetchMetadataString(ePubDoc, EPUB_CREATOR); if (!value.isEmpty()) { if (value.startsWith(QLatin1String("aut:"), Qt::CaseInsensitive)) { value = value.mid(4).simplified(); @@ -116,17 +125,17 @@ graph << con; }*/ - value = fetchMetadata(ePubDoc, EPUB_PUBLISHER); + value = fetchMetadataString(ePubDoc, EPUB_PUBLISHER); if (!value.isEmpty()) { result->add(Property::Publisher, value); } - value = fetchMetadata(ePubDoc, EPUB_DESCRIPTION); + value = fetchMetadataString(ePubDoc, EPUB_DESCRIPTION); if (!value.isEmpty()) { result->add(Property::Comment, value); } - value = fetchMetadata(ePubDoc, EPUB_DATE); + value = fetchMetadataString(ePubDoc, EPUB_DATE); if (!value.isEmpty()) { if (value.startsWith(QLatin1String("Unspecified:"), Qt::CaseInsensitive)) { value = value.mid(QByteArray("Unspecified:").size()).simplified();