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