1 /*
2 EmbeddedImageData tests.
3
4 SPDX-FileCopyrightText: 2018 Alexander Stippich <a.stippich@gmx.net>
5
6 SPDX-License-Identifier: LGPL-2.1-or-later
7 */
8
9 #include "embeddedimagedatatest.h"
10 #include "embeddedimagedata.h"
11 #include "indexerextractortestsconfig.h"
12
13 #include <QMimeDatabase>
14 #include <QTest>
15 #include <QByteArray>
16
17 using namespace KFileMetaData;
18
testFilePath(const QString & fileName) const19 QString EmbeddedImageDataTest::testFilePath(const QString& fileName) const
20 {
21 return QLatin1String(INDEXER_TESTS_SAMPLE_FILES_PATH) + QLatin1Char('/') + fileName;
22 }
23
initTestCase()24 void EmbeddedImageDataTest::initTestCase()
25 {
26 QFile imgFile(testFilePath("cover.jpg"));
27 imgFile.open(QIODevice::ReadOnly);
28 m_coverImage = imgFile.readAll();
29 }
30
test()31 void EmbeddedImageDataTest::test()
32 {
33 QFETCH(QString, fileName);
34 QMimeDatabase mimeDb;
35 QString testAudioFile;
36 EmbeddedImageData imageData;
37 QMap<EmbeddedImageData::ImageType, QByteArray> images;
38
39 testAudioFile = testFilePath(fileName);
40 const QString mimeType = mimeDb.mimeTypeForFile(testAudioFile).name();
41 if (!imageData.mimeTypes().contains(mimeType)) {
42 qWarning() << "mimeType" << mimeType << "not in imageData.mimeTypes()" << imageData.mimeTypes();
43 }
44 QVERIFY(imageData.mimeTypes().contains(mimeType));
45 images = imageData.imageData(testAudioFile);
46 QCOMPARE(images.value(EmbeddedImageData::FrontCover), m_coverImage);
47 }
48
test_data()49 void EmbeddedImageDataTest::test_data()
50 {
51 QTest::addColumn<QString>("fileName");
52
53 QTest::addRow("aiff")
54 << QStringLiteral("test.aif")
55 ;
56
57 QTest::addRow("ape")
58 << QStringLiteral("test.ape")
59 ;
60
61 QTest::addRow("opus")
62 << QStringLiteral("test.opus")
63 ;
64
65 QTest::addRow("ogg")
66 << QStringLiteral("test.ogg")
67 ;
68
69 QTest::addRow("flac")
70 << QStringLiteral("test.flac")
71 ;
72
73 QTest::addRow("mp3")
74 << QStringLiteral("test.mp3")
75 ;
76
77 QTest::addRow("m4a")
78 << QStringLiteral("test.m4a")
79 ;
80
81 QTest::addRow("mpc")
82 << QStringLiteral("test.mpc")
83 ;
84
85 QTest::addRow("speex")
86 << QStringLiteral("test.spx")
87 ;
88
89 QTest::addRow("wav")
90 << QStringLiteral("test.wav")
91 ;
92
93 QTest::addRow("wavpack")
94 << QStringLiteral("test.wv")
95 ;
96
97 QTest::addRow("wma")
98 << QStringLiteral("test.wma")
99 ;
100 }
101
testWrite()102 void EmbeddedImageDataTest::testWrite()
103 {
104 QFETCH(QString, fileName);
105 EmbeddedImageData imageData;
106
107 QString testFileName = testFilePath(QStringLiteral("writer") + fileName);
108
109 QFile::copy(testFilePath(fileName), testFileName);
110
111 QMap<EmbeddedImageData::ImageType, QByteArray> writeImages;
112 QMap<EmbeddedImageData::ImageType, QByteArray> readImages;
113
114 writeImages.insert(EmbeddedImageData::ImageType::FrontCover, m_coverImage);
115 imageData.writeImageData(testFileName, writeImages);
116 readImages = imageData.imageData(testFileName);
117
118 QCOMPARE(readImages.value(EmbeddedImageData::FrontCover), writeImages.value(EmbeddedImageData::FrontCover));
119
120 QFile::remove(testFileName);
121 }
122
testWrite_data()123 void EmbeddedImageDataTest::testWrite_data()
124 {
125 QTest::addColumn<QString>("fileName");
126
127 QTest::addRow("aiff")
128 << QStringLiteral("test.aif")
129 ;
130
131 QTest::addRow("ape")
132 << QStringLiteral("test.ape")
133 ;
134
135 QTest::addRow("opus")
136 << QStringLiteral("test.opus")
137 ;
138
139 QTest::addRow("ogg")
140 << QStringLiteral("test.ogg")
141 ;
142
143 QTest::addRow("flac")
144 << QStringLiteral("test.flac")
145 ;
146
147 QTest::addRow("mp3")
148 << QStringLiteral("test.mp3")
149 ;
150
151 QTest::addRow("m4a")
152 << QStringLiteral("test.m4a")
153 ;
154
155 QTest::addRow("mpc")
156 << QStringLiteral("test.mpc")
157 ;
158
159 QTest::addRow("speex")
160 << QStringLiteral("test.spx")
161 ;
162
163 QTest::addRow("wav")
164 << QStringLiteral("test.wav")
165 ;
166
167 QTest::addRow("wavpack")
168 << QStringLiteral("test.wv")
169 ;
170
171 QTest::addRow("wma")
172 << QStringLiteral("test.wma")
173 ;
174 }
testDelete()175 void EmbeddedImageDataTest::testDelete()
176 {
177 QFETCH(QString, fileName);
178 EmbeddedImageData imageData;
179
180 QString testFileName = testFilePath(QStringLiteral("writer_del_") + fileName);
181
182 QFile::copy(testFilePath(fileName), testFileName);
183
184 QMap<EmbeddedImageData::ImageType, QByteArray> writeImages;
185 QMap<EmbeddedImageData::ImageType, QByteArray> readImages;
186
187 writeImages.insert(EmbeddedImageData::ImageType::FrontCover, QByteArray());
188 imageData.writeImageData(testFileName, writeImages);
189 readImages = imageData.imageData(testFileName);
190
191 QVERIFY(!readImages.contains(EmbeddedImageData::FrontCover));
192
193 QFile::remove(testFileName);
194 }
195
testDelete_data()196 void EmbeddedImageDataTest::testDelete_data()
197 {
198 testWrite_data();
199 }
200
testDeleteInsert()201 void EmbeddedImageDataTest::testDeleteInsert()
202 {
203 QFETCH(QString, fileName);
204 EmbeddedImageData imageData;
205
206 QString testFileName = testFilePath(QStringLiteral("writer_delinsert_") + fileName);
207
208 QFile::copy(testFilePath(fileName), testFileName);
209
210 QFile imgFile(testFilePath("test.jpg"));
211 imgFile.open(QIODevice::ReadOnly);
212
213 QMap<EmbeddedImageData::ImageType, QByteArray> delImages;
214 QMap<EmbeddedImageData::ImageType, QByteArray> writeImages;
215 QMap<EmbeddedImageData::ImageType, QByteArray> readImages;
216
217 delImages.insert(EmbeddedImageData::ImageType::FrontCover, QByteArray());
218 writeImages.insert(EmbeddedImageData::ImageType::FrontCover, m_coverImage);
219
220 imageData.writeImageData(testFileName, delImages);
221 readImages = imageData.imageData(testFileName);
222
223 QVERIFY(!readImages.contains(EmbeddedImageData::FrontCover));
224
225 imageData.writeImageData(testFileName, writeImages);
226 readImages = imageData.imageData(testFileName);
227
228 QCOMPARE(readImages.value(EmbeddedImageData::FrontCover), writeImages.value(EmbeddedImageData::FrontCover));
229
230 QFile::remove(testFileName);
231 }
232
testDeleteInsert_data()233 void EmbeddedImageDataTest::testDeleteInsert_data()
234 {
235 testWrite_data();
236 }
237
testMultiImage()238 void EmbeddedImageDataTest::testMultiImage()
239 {
240 QFETCH(QString, fileName);
241 QFETCH(EmbeddedImageData::ImageTypes, imageTypes);
242 EmbeddedImageData imageData;
243
244 QString testFileName = testFilePath(QStringLiteral("writer_multiimage_") + fileName);
245
246 QFile::copy(testFilePath(fileName), testFileName);
247
248 QMap<EmbeddedImageData::ImageType, QByteArray> writeImages;
249
250 auto readImages = imageData.imageData(testFileName);
251 QVERIFY(readImages.contains(EmbeddedImageData::FrontCover));
252
253 using Image = EmbeddedImageData::ImageType;
254 for (auto type : { Image::Other, Image::BackCover }) {
255 if (type & imageTypes) {
256 writeImages.insert(type, m_coverImage);
257 }
258 }
259 imageData.writeImageData(testFileName, writeImages);
260
261 readImages = imageData.imageData(testFileName);
262 // Test if FrontCover still exists
263 QVERIFY(readImages.contains(EmbeddedImageData::FrontCover));
264
265 for (auto type : { Image::FrontCover, Image::Other, Image::BackCover }) {
266 if (type & imageTypes) {
267 QVERIFY2(readImages.contains(type), qPrintable(QString("has imagetype %1").arg(type)));
268 QCOMPARE(readImages.value(type), m_coverImage);
269 }
270 }
271
272 QFile::remove(testFileName);
273 }
274
testMultiImage_data()275 void EmbeddedImageDataTest::testMultiImage_data()
276 {
277 using ImageTypes = EmbeddedImageData::ImageTypes;
278 QTest::addColumn<QString>("fileName");
279 QTest::addColumn<ImageTypes>("imageTypes");
280
281 using Image = EmbeddedImageData::ImageType;
282 QTest::addRow("aiff") << QStringLiteral("test.aif") << ImageTypes{ Image::Other, Image::Artist };
283 QTest::addRow("opus") << QStringLiteral("test.opus") << ImageTypes{ Image::Other, Image::BackCover };
284 QTest::addRow("flac") << QStringLiteral("test.flac") << ImageTypes{ Image::Other, Image::Composer };
285 QTest::addRow("wma") << QStringLiteral("test.wma") << ImageTypes{ Image::Other, Image::Band };
286 }
287
288
289 QTEST_GUILESS_MAIN(EmbeddedImageDataTest)
290