1 /* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 2015-08-12
7 * Description : metadata settings tests for getImageTagPaths and setImageTagPaths.
8 *
9 * Copyright (C) 2015 by Veaceslav Munteanu <veaceslav dot munteanu90 at gmail dot com>
10 *
11 * This program is free software; you can redistribute it
12 * and/or modify it under the terms of the GNU General
13 * Public License as published by the Free Software Foundation;
14 * either version 2, or (at your option)
15 * any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * ============================================================ */
23
24 #include "tagsreadwrite_utest.h"
25
26 // Qt includes
27
28 #include <QTest>
29 #include <QStringList>
30 #include <QString>
31
32 // Local includes
33
34 #include "dmetadata.h"
35 #include "digikam_debug.h"
36
37 using namespace Digikam;
38
QTEST_GUILESS_MAIN(TagsReadWriteTest)39 QTEST_GUILESS_MAIN(TagsReadWriteTest)
40
41 TagsReadWriteTest::TagsReadWriteTest(QObject* const parent)
42 : QObject(parent)
43 {
44 }
45
initTestCase()46 void TagsReadWriteTest::initTestCase()
47 {
48 MetaEngine::initializeExiv2();
49 qCDebug(DIGIKAM_TESTS_LOG) << "Using Exiv2 Version:" << MetaEngine::Exiv2Version();
50
51 this->tagSet1 << QLatin1String("/root/child1/child2")
52 << QLatin1String("/root/extra/child2/triple")
53 << QLatin1String("/root/extra/ch223/triple");
54
55 this->tagSet2 << QLatin1String("/root/child1/chilasdfasdf")
56 << QLatin1String("/root/exrebhtra/chsdrild2/asdfad")
57 << QLatin1String("/root/exfgvdtra/ch2gfg23/tridfgvle");
58
59 this->tagSet3 << QLatin1String("/rowet/child1/crehild2")
60 << QLatin1String("/rsdfsoot/extsdera/chihgld2/triple")
61 << QLatin1String("/roosdst/extfamnbra/ch2hg23/triple");
62 }
63
cleanupTestCase()64 void TagsReadWriteTest::cleanupTestCase()
65 {
66 }
67
testSimpleReadAfterWrite()68 void TagsReadWriteTest::testSimpleReadAfterWrite()
69 {
70 QScopedPointer<DMetadata> dmeta(new DMetadata);
71 QStringList tagPaths2;
72
73 dmeta->setItemTagsPath(this->tagSet1);
74 dmeta->getItemTagsPath(tagPaths2);
75
76 QCOMPARE(tagSet1, tagPaths2);
77 }
78
testWriteToDisabledNamespaces()79 void TagsReadWriteTest::testWriteToDisabledNamespaces()
80 {
81 QScopedPointer<DMetadata> dmeta(new DMetadata);
82
83 DMetadataSettingsContainer dmsettings;
84 QStringList empty;
85 QStringList secondNamespace;
86
87 NamespaceEntry tagNs2;
88 tagNs2.namespaceName = QLatin1String("Xmp.MicrosoftPhoto.LastKeywordXMP");
89 tagNs2.tagPaths = NamespaceEntry::TAGPATH;
90 tagNs2.separator = QLatin1Char('/');
91 tagNs2.nsType = NamespaceEntry::TAGS;
92 tagNs2.index = 1;
93 tagNs2.specialOpts = NamespaceEntry::TAG_XMPBAG;
94 tagNs2.subspace = NamespaceEntry::XMP;
95 tagNs2.isDisabled = true;
96
97 NamespaceEntry tagNs3;
98 tagNs3.namespaceName = QLatin1String("Xmp.lr.hierarchicalSubject");
99 tagNs3.tagPaths = NamespaceEntry::TAGPATH;
100 tagNs3.separator = QLatin1Char('|');
101 tagNs3.nsType = NamespaceEntry::TAGS;
102 tagNs3.index = 2;
103 tagNs3.specialOpts = NamespaceEntry::TAG_XMPBAG;
104 tagNs3.subspace = NamespaceEntry::XMP;
105 tagNs3.alternativeName = QLatin1String("Xmp.lr.HierarchicalSubject");
106 tagNs3.secondNameOpts = NamespaceEntry::TAG_XMPSEQ;
107
108 dmsettings.getWriteMapping(NamespaceEntry::DM_TAG_CONTAINER()).clear();
109 dmsettings.getWriteMapping(NamespaceEntry::DM_TAG_CONTAINER())
110 << tagNs2
111 << tagNs3;
112
113 dmeta->setItemTagsPath(tagSet1, dmsettings);
114
115 empty = dmeta->getXmpTagStringBag("Xmp.MicrosoftPhoto.LastKeywordXMP", false);
116
117 QCOMPARE(empty, QStringList());
118
119 secondNamespace = dmeta->getXmpTagStringBag("Xmp.lr.hierarchicalSubject", false);
120
121 secondNamespace.replaceInStrings(QLatin1String("|"), QLatin1String("/"));
122
123 QCOMPARE(secondNamespace, tagSet1);
124 }
125
testReadFromDisabledNamespaces()126 void TagsReadWriteTest::testReadFromDisabledNamespaces()
127 {
128 QScopedPointer<DMetadata> dmeta(new DMetadata);
129
130 DMetadataSettingsContainer dmsettings;
131 QStringList actual;
132
133 NamespaceEntry tagNs2;
134 tagNs2.namespaceName = QLatin1String("Xmp.MicrosoftPhoto.LastKeywordXMP");
135 tagNs2.tagPaths = NamespaceEntry::TAGPATH;
136 tagNs2.separator = QLatin1Char('/');
137 tagNs2.nsType = NamespaceEntry::TAGS;
138 tagNs2.index = 1;
139 tagNs2.specialOpts = NamespaceEntry::TAG_XMPBAG;
140 tagNs2.subspace = NamespaceEntry::XMP;
141 tagNs2.isDisabled = true;
142
143 NamespaceEntry tagNs3;
144 tagNs3.namespaceName = QLatin1String("Xmp.lr.hierarchicalSubject");
145 tagNs3.tagPaths = NamespaceEntry::TAGPATH;
146 tagNs3.separator = QLatin1Char('|');
147 tagNs3.nsType = NamespaceEntry::TAGS;
148 tagNs3.index = 2;
149 tagNs3.specialOpts = NamespaceEntry::TAG_XMPBAG;
150 tagNs3.subspace = NamespaceEntry::XMP;
151 tagNs3.alternativeName = QLatin1String("Xmp.lr.HierarchicalSubject");
152 tagNs3.secondNameOpts = NamespaceEntry::TAG_XMPSEQ;
153
154 dmsettings.getReadMapping(NamespaceEntry::DM_TAG_CONTAINER()).clear();
155 dmsettings.getReadMapping(NamespaceEntry::DM_TAG_CONTAINER())
156 << tagNs2
157 << tagNs3;
158
159 dmeta->setXmpTagStringBag("Xmp.MicrosoftPhoto.LastKeywordXMP", tagSet1);
160
161 dmeta->setXmpTagStringBag("Xmp.lr.hierarchicalSubject", tagSet2);
162
163 dmeta->getItemTagsPath(actual, dmsettings);
164
165 QCOMPARE(actual, tagSet2);
166 }
167
testTagSeparatorWrite()168 void TagsReadWriteTest::testTagSeparatorWrite()
169 {
170 QScopedPointer<DMetadata> dmeta(new DMetadata);
171
172 DMetadataSettingsContainer dmsettings;
173 QStringList readResult;
174 QStringList expected;
175
176 NamespaceEntry tagNs3;
177 tagNs3.namespaceName = QLatin1String("Xmp.lr.hierarchicalSubject");
178 tagNs3.tagPaths = NamespaceEntry::TAGPATH;
179 tagNs3.separator = QLatin1Char('|');
180 tagNs3.nsType = NamespaceEntry::TAGS;
181 tagNs3.index = 2;
182 tagNs3.specialOpts = NamespaceEntry::TAG_XMPBAG;
183 tagNs3.subspace = NamespaceEntry::XMP;
184 tagNs3.alternativeName = QLatin1String("Xmp.lr.HierarchicalSubject");
185 tagNs3.secondNameOpts = NamespaceEntry::TAG_XMPSEQ;
186
187 dmsettings.getWriteMapping(NamespaceEntry::DM_TAG_CONTAINER()).clear();
188 dmsettings.getWriteMapping(NamespaceEntry::DM_TAG_CONTAINER())
189 << tagNs3;
190
191 dmeta->setItemTagsPath(tagSet1, dmsettings);
192
193 readResult = dmeta->getXmpTagStringBag("Xmp.lr.hierarchicalSubject", false);
194
195 expected = tagSet1;
196 expected.replaceInStrings(QLatin1String("/"), QLatin1String("|"));
197
198 QCOMPARE(readResult, expected);
199 }
200
testTagSeparatorRead()201 void TagsReadWriteTest::testTagSeparatorRead()
202 {
203 QScopedPointer<DMetadata> dmeta(new DMetadata);
204
205 DMetadataSettingsContainer dmsettings;
206 QStringList toWrite;
207 QStringList actual;
208 QStringList reference;
209
210 NamespaceEntry tagNs3;
211 tagNs3.namespaceName = QLatin1String("Xmp.lr.hierarchicalSubject");
212 tagNs3.tagPaths = NamespaceEntry::TAGPATH;
213 tagNs3.separator = QLatin1Char('|');
214 tagNs3.nsType = NamespaceEntry::TAGS;
215 tagNs3.index = 2;
216 tagNs3.specialOpts = NamespaceEntry::TAG_XMPBAG;
217 tagNs3.subspace = NamespaceEntry::XMP;
218 tagNs3.alternativeName = QLatin1String("Xmp.lr.HierarchicalSubject");
219 tagNs3.secondNameOpts = NamespaceEntry::TAG_XMPSEQ;
220
221 dmsettings.getReadMapping(NamespaceEntry::DM_TAG_CONTAINER()).clear();
222 dmsettings.getReadMapping(NamespaceEntry::DM_TAG_CONTAINER())
223 << tagNs3;
224
225 toWrite = tagSet1;
226 toWrite.replaceInStrings(QLatin1String("/"), QLatin1String("|"));
227
228 dmeta->setXmpTagStringBag("Xmp.lr.hierarchicalSubject", toWrite);
229
230 reference = dmeta->getXmpTagStringBag("Xmp.lr.hierarchicalSubject", false);
231
232 QCOMPARE(reference, toWrite);
233
234 dmeta->getItemTagsPath(actual, dmsettings);
235
236 QCOMPARE(actual, tagSet1);
237 }
238
testTagReadAlternativeNameSpace()239 void TagsReadWriteTest::testTagReadAlternativeNameSpace()
240 {
241 QScopedPointer<DMetadata> dmeta(new DMetadata);
242
243 DMetadataSettingsContainer dmsettings;
244 QStringList toWrite;
245 QStringList actual;
246 QStringList reference;
247
248 NamespaceEntry tagNs3;
249 tagNs3.namespaceName = QLatin1String("Xmp.lr.hierarchicalSubject");
250 tagNs3.tagPaths = NamespaceEntry::TAGPATH;
251 tagNs3.separator = QLatin1Char('|');
252 tagNs3.nsType = NamespaceEntry::TAGS;
253 tagNs3.index = 2;
254 tagNs3.specialOpts = NamespaceEntry::TAG_XMPBAG;
255 tagNs3.subspace = NamespaceEntry::XMP;
256 tagNs3.alternativeName = QLatin1String("Xmp.lr.HierarchicalSubject");
257 tagNs3.secondNameOpts = NamespaceEntry::TAG_XMPSEQ;
258
259 dmsettings.getReadMapping(NamespaceEntry::DM_TAG_CONTAINER()).clear();
260 dmsettings.getReadMapping(NamespaceEntry::DM_TAG_CONTAINER())
261 << tagNs3;
262
263 toWrite = tagSet1;
264 toWrite.replaceInStrings(QLatin1String("/"), QLatin1String("|"));
265
266 dmeta->setXmpTagStringSeq("Xmp.lr.HierarchicalSubject", toWrite);
267
268 // We write some data to alternative namespace
269 reference = dmeta->getXmpTagStringSeq("Xmp.lr.HierarchicalSubject", false);
270
271 QCOMPARE(reference, toWrite);
272
273 dmeta->getItemTagsPath(actual, dmsettings);
274
275 QCOMPARE(actual, tagSet1);
276 }
277