File indexing completed on 2024-04-28 15:22:17

0001 /*
0002     SPDX-FileCopyrightText: 2016 Varun Joshi <varunj.1011@gmail.com>
0003     SPDX-FileCopyrightText: 2018 Alexander Stippich <a.stippich@gmx.net>
0004 
0005     SPDX-License-Identifier: LGPL-2.1-or-later
0006 */
0007 
0008 #include "taglibwritertest.h"
0009 #include "indexerextractortestsconfig.h"
0010 #include "writers/taglibwriter.h"
0011 #include "writedata.h"
0012 #include <kfilemetadata/ExtractorCollection>
0013 #include <kfilemetadata/Extractor>
0014 #include <kfilemetadata/ExtractionResult>
0015 #include <kfilemetadata/SimpleExtractionResult>
0016 #include "taglib.h"
0017 #include "fileref.h"
0018 
0019 #include <QTest>
0020 #include <QFile>
0021 #include <QMap>
0022 
0023 using namespace KFileMetaData;
0024 
0025 QString TagLibWriterTest::testFilePath(const QString& fileName) const
0026 {
0027     return QLatin1String(INDEXER_TESTS_SAMPLE_FILES_PATH) + QLatin1Char('/') + fileName;
0028 }
0029 
0030 void TagLibWriterTest::initTestCase()
0031 {
0032     QFile imgFile(testFilePath("cover.jpg"));
0033     imgFile.open(QIODevice::ReadOnly);
0034     m_coverImage = imgFile.readAll();
0035 }
0036 
0037 void TagLibWriterTest::extractResult(const QString &mimeType, KFileMetaData::ExtractionResult &result)
0038 {
0039     KFileMetaData::ExtractorCollection extractors;
0040     QList<KFileMetaData::Extractor*> extractorList = extractors.fetchExtractors(mimeType);
0041     if (extractorList.isEmpty()) {
0042         QFAIL("This mime type is not supported by the extractor. Likely a newer KDE Frameworks version is required.");
0043     }
0044     if (extractorList.size() > 1) {
0045         QWARN("Multiple extractors are available.");
0046     }
0047     KFileMetaData::Extractor* ex = extractorList.first();
0048     ex->extract(&result);
0049 }
0050 
0051 void TagLibWriterTest::testCommonData()
0052 {
0053     QFETCH(QString, fileType);
0054     QFETCH(QString, mimeType);
0055     QFETCH(QString, stringSuffix);
0056 
0057     QString temporaryFileName = testFilePath(QStringLiteral("writertest.") + fileType);
0058 
0059     QFile::copy(testFilePath("test." + fileType), temporaryFileName);
0060     TagLibWriter writerPlugin{this};
0061     QCOMPARE(writerPlugin.writeMimetypes().contains(mimeType),true);
0062 
0063     WriteData data(temporaryFileName, mimeType);
0064 
0065     data.add(Property::Title, QString(QStringLiteral("Title1") + stringSuffix));
0066     data.add(Property::Artist, QString(QStringLiteral("Artist1") + stringSuffix));
0067     data.add(Property::Album, QString(QStringLiteral("Album1") + stringSuffix));
0068     data.add(Property::AlbumArtist, QString(QStringLiteral("AlbumArtist1") + stringSuffix));
0069     data.add(Property::Composer, QString(QStringLiteral("Composer1") + stringSuffix));
0070     data.add(Property::TrackNumber, 10);
0071     data.add(Property::DiscNumber, 2);
0072     data.add(Property::ReleaseYear, 1999);
0073     data.add(Property::Genre, QString(QStringLiteral("Genre1") + stringSuffix));
0074     data.add(Property::Comment, QString(QStringLiteral("Comment1") + stringSuffix));
0075     data.add(Property::Copyright, QString(QStringLiteral("Copyright1") + stringSuffix));
0076 
0077     writerPlugin.write(data);
0078 
0079     KFileMetaData::SimpleExtractionResult result(temporaryFileName, mimeType, KFileMetaData::ExtractionResult::ExtractMetaData);
0080     extractResult(mimeType, result);
0081 
0082     QCOMPARE(result.properties().value(Property::Title), QVariant(QStringLiteral("Title1") + stringSuffix));
0083     QCOMPARE(result.properties().value(Property::Artist), QVariant(QStringLiteral("Artist1") + stringSuffix));
0084     QCOMPARE(result.properties().value(Property::Album), QVariant(QStringLiteral("Album1") + stringSuffix));
0085     QCOMPARE(result.properties().value(Property::AlbumArtist), QVariant(QStringLiteral("AlbumArtist1") + stringSuffix));
0086     QCOMPARE(result.properties().value(Property::Composer), QVariant(QStringLiteral("Composer1") + stringSuffix));
0087     QCOMPARE(result.properties().value(Property::TrackNumber).toInt(), 10);
0088     QCOMPARE(result.properties().value(Property::DiscNumber).toInt(), 2);
0089     QCOMPARE(result.properties().value(Property::ReleaseYear).toInt(), 1999);
0090     QCOMPARE(result.properties().value(Property::Genre), QVariant(QStringLiteral("Genre1") + stringSuffix));
0091     QCOMPARE(result.properties().value(Property::Comment), QVariant(QStringLiteral("Comment1") + stringSuffix));
0092     QCOMPARE(result.properties().value(Property::Copyright), QVariant(QStringLiteral("Copyright1") + stringSuffix));
0093 
0094     QFile::remove(temporaryFileName);
0095 }
0096 
0097 void TagLibWriterTest::testCommonData_data()
0098 {
0099     // Add some unicode characters, use codepoints to avoid any issues with
0100     // source encoding: "€µ"
0101     static const QChar data[2] = { QChar(0x20ac), QChar(0xb5) };
0102     QString unicodeTestStringSuffix(data, 2);
0103 
0104     QTest::addColumn<QString>("fileType");
0105     QTest::addColumn<QString>("mimeType");
0106     QTest::addColumn<QString>("stringSuffix");
0107 
0108 
0109     QTest::addRow("aiff")
0110         << QStringLiteral("aif")
0111         << QStringLiteral("audio/x-aiff")
0112         << QString()
0113         ;
0114 
0115     QTest::addRow("aiff_unicode")
0116         << QStringLiteral("aif")
0117         << QStringLiteral("audio/x-aiff")
0118         << unicodeTestStringSuffix
0119         ;
0120 
0121     QTest::addRow("ape")
0122         << QStringLiteral("ape")
0123         << QStringLiteral("audio/x-ape")
0124         << QString()
0125         ;
0126 
0127     QTest::addRow("ape_unicode")
0128         << QStringLiteral("ape")
0129         << QStringLiteral("audio/x-ape")
0130         << unicodeTestStringSuffix
0131         ;
0132 
0133     QTest::addRow("flac")
0134         << QStringLiteral("flac")
0135         << QStringLiteral("audio/flac")
0136         << QString()
0137         ;
0138 
0139     QTest::addRow("flac_unicode")
0140         << QStringLiteral("flac")
0141         << QStringLiteral("audio/flac")
0142         << unicodeTestStringSuffix
0143         ;
0144 
0145     QTest::addRow("m4a")
0146         << QStringLiteral("m4a")
0147         << QStringLiteral("audio/mp4")
0148         << QString()
0149         ;
0150 
0151     QTest::addRow("m4a_unicode")
0152         << QStringLiteral("m4a")
0153         << QStringLiteral("audio/mp4")
0154         << unicodeTestStringSuffix
0155         ;
0156 
0157     QTest::addRow("mp3")
0158         << QStringLiteral("mp3")
0159         << QStringLiteral("audio/mpeg3")
0160         << QString()
0161         ;
0162 
0163     QTest::addRow("mp3_unicode")
0164         << QStringLiteral("mp3")
0165         << QStringLiteral("audio/mpeg3")
0166         << unicodeTestStringSuffix
0167         ;
0168 
0169     QTest::addRow("mpc")
0170         << QStringLiteral("mpc")
0171         << QStringLiteral("audio/x-musepack")
0172         << QString()
0173         ;
0174 
0175     QTest::addRow("mpc_unicode")
0176         << QStringLiteral("mpc")
0177         << QStringLiteral("audio/x-musepack")
0178         << unicodeTestStringSuffix
0179         ;
0180 
0181     QTest::addRow("ogg")
0182         << QStringLiteral("ogg")
0183         << QStringLiteral("audio/ogg")
0184         << QString()
0185         ;
0186 
0187     QTest::addRow("ogg_unicode")
0188         << QStringLiteral("ogg")
0189         << QStringLiteral("audio/ogg")
0190         << unicodeTestStringSuffix
0191         ;
0192 
0193     QTest::addRow("opus")
0194         << QStringLiteral("opus")
0195         << QStringLiteral("audio/opus")
0196         << QString()
0197         ;
0198 
0199     QTest::addRow("opus_unicode")
0200         << QStringLiteral("opus")
0201         << QStringLiteral("audio/opus")
0202         << unicodeTestStringSuffix
0203         ;
0204 
0205     QTest::addRow("speex")
0206         << QStringLiteral("spx")
0207         << QStringLiteral("audio/x-speex+ogg")
0208         << QString()
0209         ;
0210 
0211     QTest::addRow("speex_unicode")
0212         << QStringLiteral("spx")
0213         << QStringLiteral("audio/x-speex+ogg")
0214         << unicodeTestStringSuffix
0215         ;
0216 
0217     QTest::addRow("wav")
0218         << QStringLiteral("wav")
0219         << QStringLiteral("audio/wav")
0220         << QString()
0221         ;
0222 
0223     QTest::addRow("wav_unicode")
0224         << QStringLiteral("wav")
0225         << QStringLiteral("audio/wav")
0226         << unicodeTestStringSuffix
0227         ;
0228 
0229     QTest::addRow("wavpack")
0230         << QStringLiteral("wv")
0231         << QStringLiteral("audio/x-wavpack")
0232         << QString()
0233         ;
0234 
0235     QTest::addRow("wavpack_unicode")
0236         << QStringLiteral("wv")
0237         << QStringLiteral("audio/x-wavpack")
0238         << unicodeTestStringSuffix
0239         ;
0240 
0241     QTest::addRow("wma")
0242         << QStringLiteral("wma")
0243         << QStringLiteral("audio/x-ms-wma")
0244         << QString()
0245         ;
0246 
0247     QTest::addRow("wma_unicode")
0248         << QStringLiteral("wma")
0249         << QStringLiteral("audio/x-ms-wma")
0250         << unicodeTestStringSuffix
0251         ;
0252 }
0253 
0254 void TagLibWriterTest::testExtendedData()
0255 {
0256     QFETCH(QString, fileType);
0257     QFETCH(QString, mimeType);
0258 
0259     QString temporaryFileName = testFilePath(QStringLiteral("writertest.") + fileType);
0260 
0261     QFile::copy(testFilePath("test." + fileType), temporaryFileName);
0262     TagLibWriter writerPlugin{this};
0263 
0264     WriteData data(temporaryFileName, mimeType);
0265 
0266     data.add(Property::Composer, QStringLiteral("Composer1"));
0267     data.add(Property::Lyricist, QStringLiteral("Lyricist1"));
0268     data.add(Property::Conductor, QStringLiteral("Conductor1"));
0269     data.add(Property::Lyrics, QStringLiteral("Lyrics1"));
0270     data.add(Property::Language, QStringLiteral("Language1"));
0271 
0272     writerPlugin.write(data);
0273 
0274     KFileMetaData::SimpleExtractionResult result(temporaryFileName, mimeType, KFileMetaData::ExtractionResult::ExtractMetaData);
0275     extractResult(mimeType, result);
0276 
0277     QCOMPARE(result.properties().value(Property::Composer), QVariant(QStringLiteral("Composer1")));
0278     QCOMPARE(result.properties().value(Property::Lyricist), QVariant(QStringLiteral("Lyricist1")));
0279     QCOMPARE(result.properties().value(Property::Conductor), QVariant(QStringLiteral("Conductor1")));
0280     QCOMPARE(result.properties().value(Property::Lyrics), QVariant(QStringLiteral("Lyrics1")));
0281     QCOMPARE(result.properties().value(Property::Language), QVariant(QStringLiteral("Language1")));
0282 
0283     QFile::remove(temporaryFileName);
0284 }
0285 
0286 void TagLibWriterTest::testExtendedData_data()
0287 {
0288     QTest::addColumn<QString>("fileType");
0289     QTest::addColumn<QString>("mimeType");
0290 
0291     QTest::addRow("aiff")
0292         << QStringLiteral("aif")
0293         << QStringLiteral("audio/x-aiff")
0294         ;
0295 
0296     QTest::addRow("ape")
0297         << QStringLiteral("ape")
0298         << QStringLiteral("audio/x-ape")
0299         ;
0300 
0301     QTest::addRow("flac")
0302         << QStringLiteral("flac")
0303         << QStringLiteral("audio/flac")
0304         ;
0305 
0306     QTest::addRow("mp3")
0307         << QStringLiteral("mp3")
0308         << QStringLiteral("audio/mpeg3")
0309         ;
0310 
0311     QTest::addRow("mpc")
0312         << QStringLiteral("mpc")
0313         << QStringLiteral("audio/x-musepack")
0314         ;
0315 
0316     QTest::addRow("ogg")
0317         << QStringLiteral("ogg")
0318         << QStringLiteral("audio/ogg")
0319         ;
0320 
0321     QTest::addRow("opus")
0322         << QStringLiteral("opus")
0323         << QStringLiteral("audio/opus")
0324         ;
0325 
0326     QTest::addRow("speex")
0327         << QStringLiteral("spx")
0328         << QStringLiteral("audio/x-speex+ogg")
0329         ;
0330 
0331     QTest::addRow("wav")
0332         << QStringLiteral("wav")
0333         << QStringLiteral("audio/wav")
0334         ;
0335 
0336     QTest::addRow("wavpack")
0337         << QStringLiteral("wv")
0338         << QStringLiteral("audio/x-wavpack")
0339         ;
0340 }
0341 
0342 void TagLibWriterTest::testRating()
0343 {
0344     QFETCH(QString, fileType);
0345     QFETCH(QString, mimeType);
0346     QFETCH(int, rating);
0347 
0348     QString temporaryFileName = testFilePath(QStringLiteral("writertest.") + fileType);
0349 
0350     QFile::copy(testFilePath("test.") + fileType, temporaryFileName);
0351     TagLibWriter writerPlugin{this};
0352     QCOMPARE(writerPlugin.writeMimetypes().contains(mimeType),true);
0353 
0354     WriteData data(temporaryFileName, mimeType);
0355 
0356     data.add(Property::Rating, rating);
0357     writerPlugin.write(data);
0358 
0359     KFileMetaData::SimpleExtractionResult result(temporaryFileName, mimeType, KFileMetaData::ExtractionResult::ExtractMetaData);
0360     extractResult(mimeType, result);
0361 
0362     QCOMPARE(result.properties().value(Property::Rating).toInt(), rating);
0363 
0364     QFile::remove(temporaryFileName);
0365 }
0366 
0367 void TagLibWriterTest::testRating_data()
0368 {
0369 
0370     QTest::addColumn<QString>("fileType");
0371     QTest::addColumn<QString>("mimeType");
0372     QTest::addColumn<int>("rating");
0373 
0374     QTest::addRow("aiff")
0375         << QStringLiteral("aif")
0376         << QStringLiteral("audio/x-aiff")
0377         << 3
0378         ;
0379 
0380     QTest::addRow("ape")
0381         << QStringLiteral("ape")
0382         << QStringLiteral("audio/x-ape")
0383         << 1
0384         ;
0385 
0386     QTest::addRow("flac")
0387         << QStringLiteral("flac")
0388         << QStringLiteral("audio/flac")
0389         << 3
0390         ;
0391 
0392     QTest::addRow("m4a")
0393         << QStringLiteral("m4a")
0394         << QStringLiteral("audio/mp4")
0395         << 5
0396         ;
0397 
0398     QTest::addRow("mp3_0")
0399         << QStringLiteral("mp3")
0400         << QStringLiteral("audio/mpeg3")
0401         << 0
0402         ;
0403 
0404     QTest::addRow("mp3_1")
0405         << QStringLiteral("mp3")
0406         << QStringLiteral("audio/mpeg3")
0407         << 1
0408         ;
0409 
0410     QTest::addRow("mp3_2")
0411         << QStringLiteral("mp3")
0412         << QStringLiteral("audio/mpeg3")
0413         << 2
0414         ;
0415 
0416     QTest::addRow("mp3_3")
0417         << QStringLiteral("mp3")
0418         << QStringLiteral("audio/mpeg3")
0419         << 3
0420         ;
0421 
0422     QTest::addRow("mp3_4")
0423         << QStringLiteral("mp3")
0424         << QStringLiteral("audio/mpeg3")
0425         << 4
0426         ;
0427 
0428     QTest::addRow("mp3_5")
0429         << QStringLiteral("mp3")
0430         << QStringLiteral("audio/mpeg3")
0431         << 5
0432         ;
0433 
0434     QTest::addRow("mp3_6")
0435         << QStringLiteral("mp3")
0436         << QStringLiteral("audio/mpeg3")
0437         << 6
0438         ;
0439 
0440     QTest::addRow("mp3_7")
0441         << QStringLiteral("mp3")
0442         << QStringLiteral("audio/mpeg3")
0443         << 7
0444         ;
0445 
0446     QTest::addRow("mp3_8")
0447         << QStringLiteral("mp3")
0448         << QStringLiteral("audio/mpeg3")
0449         << 8
0450         ;
0451 
0452     QTest::addRow("mp3_9")
0453         << QStringLiteral("mp3")
0454         << QStringLiteral("audio/mpeg3")
0455         << 9
0456         ;
0457 
0458     QTest::addRow("mp3_10")
0459         << QStringLiteral("mp3")
0460         << QStringLiteral("audio/mpeg3")
0461         << 10
0462         ;
0463 
0464     QTest::addRow("mpc")
0465         << QStringLiteral("mpc")
0466         << QStringLiteral("audio/x-musepack")
0467         << 7
0468         ;
0469 
0470     QTest::addRow("opus")
0471         << QStringLiteral("opus")
0472         << QStringLiteral("audio/opus")
0473         << 6
0474         ;
0475 
0476     QTest::addRow("speex")
0477         << QStringLiteral("spx")
0478         << QStringLiteral("audio/x-speex+ogg")
0479         << 8
0480         ;
0481 
0482     QTest::addRow("wav")
0483         << QStringLiteral("wav")
0484         << QStringLiteral("audio/wav")
0485         << 4
0486         ;
0487 
0488     QTest::addRow("wavpack")
0489         << QStringLiteral("wv")
0490         << QStringLiteral("audio/x-wavpack")
0491         << 9
0492         ;
0493 
0494     QTest::addRow("wma_0")
0495         << QStringLiteral("wma")
0496         << QStringLiteral("audio/x-ms-wma")
0497         << 0
0498         ;
0499 
0500     QTest::addRow("wma_2")
0501         << QStringLiteral("wma")
0502         << QStringLiteral("audio/x-ms-wma")
0503         << 2
0504         ;
0505 
0506     QTest::addRow("wma_4")
0507         << QStringLiteral("wma")
0508         << QStringLiteral("audio/x-ms-wma")
0509         << 4
0510         ;
0511 
0512     QTest::addRow("wma_5")
0513         << QStringLiteral("wma")
0514         << QStringLiteral("audio/x-ms-wma")
0515         << 5
0516         ;
0517 
0518     QTest::addRow("wma_6")
0519         << QStringLiteral("wma")
0520         << QStringLiteral("audio/x-ms-wma")
0521         << 6
0522         ;
0523 
0524     QTest::addRow("wma_8")
0525         << QStringLiteral("wma")
0526         << QStringLiteral("audio/x-ms-wma")
0527         << 8
0528         ;
0529 
0530     QTest::addRow("wma_10")
0531         << QStringLiteral("wma")
0532         << QStringLiteral("audio/x-ms-wma")
0533         << 10
0534         ;
0535 }
0536 
0537 void TagLibWriterTest::testComplexContactData()
0538 {
0539     QFETCH(QString, fileExtension);
0540     QFETCH(QString, mimeType);
0541 
0542     QString temporaryFileName = testFilePath(QStringLiteral("writertest.") + fileExtension);
0543 
0544     QFile::copy(testFilePath("test." + fileExtension), temporaryFileName);
0545     TagLibWriter writerPlugin{this};
0546 
0547     WriteData data(temporaryFileName, mimeType);
0548 
0549     const QMap<Property::Property, QString> properties = {
0550         { Property::Artist, QStringLiteral("Artist1 feat Artist2") },
0551         { Property::AlbumArtist, QStringLiteral("Artist1 feat. Artist2") },
0552         { Property::Composer, QStringLiteral("Composer1; Composer2") },
0553         { Property::Lyricist, QStringLiteral("Lyricist1 ft Lyricist2") },
0554         { Property::Genre, QStringLiteral("Genre1; Genre2") },
0555     };
0556 
0557     QMap<Property::Property, QString>::const_iterator it;
0558     for (it = properties.begin(); it != properties.end(); ++it) {
0559         data.add(it.key(), it.value());
0560     }
0561 
0562     writerPlugin.write(data);
0563 
0564     KFileMetaData::SimpleExtractionResult result(temporaryFileName, mimeType, KFileMetaData::ExtractionResult::ExtractMetaData);
0565     extractResult(mimeType, result);
0566 
0567     for (it = properties.begin(); it != properties.end(); ++it) {
0568          QCOMPARE(result.properties().value(it.key()), it.value());
0569     }
0570 
0571     QFile::remove(temporaryFileName);
0572 }
0573 
0574 void TagLibWriterTest::testComplexContactData_data()
0575 {
0576     QTest::addColumn<QString>("fileExtension");
0577     QTest::addColumn<QString>("mimeType");
0578 
0579     QTest::addRow("aiff")
0580         << QStringLiteral("aif")
0581         << QStringLiteral("audio/x-aiff")
0582         ;
0583 
0584     QTest::addRow("ape")
0585         << QStringLiteral("ape")
0586         << QStringLiteral("audio/x-ape")
0587         ;
0588 
0589     QTest::addRow("flac")
0590         << QStringLiteral("flac")
0591         << QStringLiteral("audio/flac")
0592         ;
0593 
0594     QTest::addRow("mp3")
0595         << QStringLiteral("mp3")
0596         << QStringLiteral("audio/mpeg3")
0597         ;
0598 
0599     QTest::addRow("mpc")
0600         << QStringLiteral("mpc")
0601         << QStringLiteral("audio/x-musepack")
0602         ;
0603 
0604     QTest::addRow("ogg")
0605         << QStringLiteral("ogg")
0606         << QStringLiteral("audio/ogg")
0607         ;
0608 
0609     QTest::addRow("opus")
0610         << QStringLiteral("opus")
0611         << QStringLiteral("audio/opus")
0612         ;
0613 
0614     QTest::addRow("speex")
0615         << QStringLiteral("spx")
0616         << QStringLiteral("audio/x-speex+ogg")
0617         ;
0618 
0619     QTest::addRow("wav")
0620         << QStringLiteral("wav")
0621         << QStringLiteral("audio/wav")
0622         ;
0623 
0624     QTest::addRow("wavpack")
0625         << QStringLiteral("wv")
0626         << QStringLiteral("audio/x-wavpack")
0627         ;
0628 }
0629 
0630 void TagLibWriterTest::testImageWrite()
0631 {
0632     QFETCH(QString, fileName);
0633     QFETCH(QString, mimeType);
0634 
0635     QString testFileName = testFilePath(QStringLiteral("writer") + fileName);
0636 
0637     QFile::copy(testFilePath(fileName), testFileName);
0638     WriteData data(testFileName, mimeType);
0639 
0640     QMap<EmbeddedImageData::ImageType, QByteArray> writeImages;
0641     writeImages.insert(EmbeddedImageData::ImageType::FrontCover, m_coverImage);
0642     data.addImageData(writeImages);
0643     
0644     TagLibWriter writerPlugin{this};
0645     writerPlugin.write(data);
0646     
0647     SimpleExtractionResult result(testFileName, mimeType, ExtractionResult::ExtractImageData);
0648     extractResult(mimeType, result);
0649 
0650     QCOMPARE(result.imageData().value(EmbeddedImageData::FrontCover), writeImages.value(EmbeddedImageData::FrontCover));
0651 
0652     QFile::remove(testFileName);
0653 }
0654 
0655 void TagLibWriterTest::testImageWrite_data()
0656 {
0657     QTest::addColumn<QString>("fileName");
0658     QTest::addColumn<QString>("mimeType");
0659 
0660     QTest::addRow("aiff")
0661             << QStringLiteral("test.aif")
0662             << QStringLiteral("audio/x-aiff")
0663             ;
0664 
0665     QTest::addRow("ape")
0666             << QStringLiteral("test.ape")
0667             << QStringLiteral("audio/x-ape")
0668             ;
0669 
0670     QTest::addRow("opus")
0671             << QStringLiteral("test.opus")
0672             << QStringLiteral("audio/opus")
0673             ;
0674 
0675     QTest::addRow("ogg")
0676             << QStringLiteral("test.ogg")
0677             << QStringLiteral("audio/ogg")
0678             ;
0679 
0680     QTest::addRow("flac")
0681             << QStringLiteral("test.flac")
0682             << QStringLiteral("audio/flac")
0683             ;
0684 
0685     QTest::addRow("mp3")
0686             << QStringLiteral("test.mp3")
0687             << QStringLiteral("audio/mpeg3")
0688             ;
0689 
0690     QTest::addRow("m4a")
0691             << QStringLiteral("test.m4a")
0692             << QStringLiteral("audio/mp4")
0693             ;
0694 
0695     QTest::addRow("mpc")
0696             << QStringLiteral("test.mpc")
0697             << QStringLiteral("audio/x-musepack")
0698             ;
0699 
0700     QTest::addRow("speex")
0701             << QStringLiteral("test.spx")
0702             << QStringLiteral("audio/x-speex+ogg")
0703             ;
0704 
0705     QTest::addRow("wav")
0706             << QStringLiteral("test.wav")
0707             << QStringLiteral("audio/wav")
0708             ;
0709 
0710     QTest::addRow("wavpack")
0711             << QStringLiteral("test.wv")
0712             << QStringLiteral("audio/x-wavpack")
0713             ;
0714 
0715     QTest::addRow("wma")
0716             << QStringLiteral("test.wma")
0717             << QStringLiteral("audio/x-ms-wma")
0718             ;
0719 }
0720 
0721 void TagLibWriterTest::testImageDelete()
0722 {
0723     QFETCH(QString, fileName);
0724     QFETCH(QString, mimeType);
0725 
0726     QString testFileName = testFilePath(QStringLiteral("writer") + fileName);
0727 
0728     QFile::copy(testFilePath(fileName), testFileName);
0729     WriteData data(testFileName, mimeType);
0730 
0731     QMap<EmbeddedImageData::ImageType, QByteArray> writeImages;
0732     writeImages.insert(EmbeddedImageData::ImageType::FrontCover, QByteArray());
0733     data.addImageData(writeImages);
0734     
0735     TagLibWriter writerPlugin{this};
0736     writerPlugin.write(data);
0737     
0738     SimpleExtractionResult result(testFileName, mimeType, ExtractionResult::ExtractImageData);
0739     extractResult(mimeType, result);
0740 
0741     QVERIFY(!result.imageData().contains(EmbeddedImageData::FrontCover));
0742 
0743     QFile::remove(testFileName);
0744 }
0745 
0746 void TagLibWriterTest::testImageDelete_data()
0747 {
0748     testImageWrite_data();
0749 }
0750 
0751 void TagLibWriterTest::testImageDeleteInsert()
0752 {
0753     QFETCH(QString, fileName);
0754     QFETCH(QString, mimeType);
0755 
0756     QString testFileName = testFilePath(QStringLiteral("writer_delinsert_") + fileName);
0757 
0758     QFile::copy(testFilePath(fileName), testFileName);
0759     WriteData data(testFileName, mimeType);
0760 
0761     QFile imgFile(testFilePath("test.jpg"));
0762     imgFile.open(QIODevice::ReadOnly);
0763 
0764     QMap<EmbeddedImageData::ImageType, QByteArray> delImages;
0765     QMap<EmbeddedImageData::ImageType, QByteArray> writeImages;
0766     QMap<EmbeddedImageData::ImageType, QByteArray> readImages;
0767 
0768     delImages.insert(EmbeddedImageData::ImageType::FrontCover, QByteArray());
0769     writeImages.insert(EmbeddedImageData::ImageType::FrontCover, m_coverImage);
0770     data.addImageData(delImages);
0771     
0772     TagLibWriter writerPlugin{this};
0773     writerPlugin.write(data);
0774 
0775     SimpleExtractionResult result(testFileName, mimeType, ExtractionResult::ExtractImageData);
0776     extractResult(mimeType, result);
0777 
0778     QVERIFY(!result.imageData().contains(EmbeddedImageData::FrontCover));
0779 
0780     data.addImageData(writeImages);
0781     writerPlugin.write(data);
0782     extractResult(mimeType, result);
0783 
0784     QCOMPARE(result.imageData().value(EmbeddedImageData::FrontCover), writeImages.value(EmbeddedImageData::FrontCover));
0785 
0786     QFile::remove(testFileName);
0787 }
0788 
0789 void TagLibWriterTest::testImageDeleteInsert_data()
0790 {
0791     testImageWrite_data();
0792 }
0793 
0794 void TagLibWriterTest::testMultiImage()
0795 {
0796     QFETCH(QString, fileName);
0797     QFETCH(QString, mimeType);
0798     QFETCH(EmbeddedImageData::ImageTypes, imageTypes);
0799 
0800     QString testFileName = testFilePath(QStringLiteral("writer_multiimage_") + fileName);
0801 
0802     QFile::copy(testFilePath(fileName), testFileName);
0803 
0804     QMap<EmbeddedImageData::ImageType, QByteArray> writeImages;
0805 
0806     SimpleExtractionResult result(testFileName, mimeType, ExtractionResult::ExtractImageData);
0807     extractResult(mimeType, result);
0808     QVERIFY(result.imageData().contains(EmbeddedImageData::FrontCover));
0809 
0810     using Image = EmbeddedImageData::ImageType;
0811     for (auto type : { Image::Other, Image::BackCover }) {
0812         if (type & imageTypes) {
0813             writeImages.insert(type, m_coverImage);
0814         }
0815     }
0816     WriteData data(testFileName, mimeType);
0817     data.addImageData(writeImages);
0818     TagLibWriter writerPlugin{this};
0819     writerPlugin.write(data);
0820 
0821     extractResult(mimeType, result);
0822     // Test if FrontCover still exists
0823     QVERIFY(result.imageData().contains(EmbeddedImageData::FrontCover));
0824 
0825     for (auto type : { Image::FrontCover, Image::Other, Image::BackCover }) {
0826         if (type & imageTypes) {
0827             QVERIFY2(result.imageData().contains(type), qPrintable(QString("has imagetype %1").arg(type)));
0828             QCOMPARE(result.imageData().value(type), m_coverImage);
0829         }
0830     }
0831 
0832     QFile::remove(testFileName);
0833 }
0834 
0835 void TagLibWriterTest::testMultiImage_data()
0836 {
0837     using ImageTypes = EmbeddedImageData::ImageTypes;
0838     QTest::addColumn<QString>("fileName");
0839     QTest::addColumn<QString>("mimeType");
0840     QTest::addColumn<ImageTypes>("imageTypes");
0841 
0842     using Image = EmbeddedImageData::ImageType;
0843     QTest::addRow("aiff") << QStringLiteral("test.aif") << QStringLiteral("audio/x-aiff") << ImageTypes{ Image::Other, Image::Artist };
0844     QTest::addRow("opus") << QStringLiteral("test.opus") << QStringLiteral("audio/opus") << ImageTypes{ Image::Other, Image::BackCover };
0845     QTest::addRow("flac") << QStringLiteral("test.flac") << QStringLiteral("audio/flac") << ImageTypes{ Image::Other, Image::Composer };
0846     QTest::addRow("wma")  << QStringLiteral("test.wma") << QStringLiteral("audio/x-ms-wma") << ImageTypes{ Image::Other, Image::Band };
0847 }
0848 
0849 QTEST_GUILESS_MAIN(TagLibWriterTest)
0850 
0851 #include "moc_taglibwritertest.cpp"