File indexing completed on 2024-05-26 04:29:08

0001 /*
0002  *  SPDX-FileCopyrightText: 2008-2009 Cyrille Berger <cberger@cberger.net>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_meta_data_test.h"
0008 
0009 #include <simpletest.h>
0010 #include "kis_meta_data_entry.h"
0011 #include "kis_meta_data_filter_registry.h"
0012 #include "kis_meta_data_value.h"
0013 #include "kis_meta_data_schema.h"
0014 #include "kis_meta_data_schema_registry.h"
0015 #include "kis_meta_data_store.h"
0016 #include "kis_meta_data_type_info.h"
0017 #include "kis_meta_data_type_info_p.h"
0018 #include "kis_meta_data_parser.h"
0019 #include "kis_meta_data_validator.h"
0020 
0021 #include <kistest.h>
0022 
0023 using namespace KisMetaData;
0024 
0025 KisMetaData::Value KisMetaDataTest::createRationalValue()
0026 {
0027     return KisMetaData::Value(Rational(12, -42));
0028 }
0029 
0030 KisMetaData::Value KisMetaDataTest::createIntegerValue(int v)
0031 {
0032     return KisMetaData::Value(v);
0033 }
0034 
0035 KisMetaData::Value KisMetaDataTest::createStringValue()
0036 {
0037     return KisMetaData::Value("Hello World !");
0038 }
0039 
0040 KisMetaData::Value KisMetaDataTest::createListValue()
0041 {
0042     QList<Value> list;
0043     list << createRationalValue() << createIntegerValue() << createStringValue();
0044     return list;
0045 }
0046 
0047 
0048 #define TEST_SCHEMA(uriStr) \
0049     { \
0050         const Schema* schema = SchemaRegistry::instance()->schemaFromUri(KisMetaData::Schema::uriStr); \
0051         QVERIFY(schema); \
0052         QCOMPARE(schema->uri(), KisMetaData::Schema::uriStr); \
0053         QCOMPARE(schema, SchemaRegistry::instance()->schemaFromPrefix(schema->prefix()) ); \
0054         QVERIFY( !SchemaRegistry::instance()->create("http://tartampion.com", schema->prefix())); \
0055         QCOMPARE(schema, SchemaRegistry::instance()->create(KisMetaData::Schema::uriStr, "tartampion")); \
0056         QCOMPARE(QString(schema->prefix() + ":hello"), schema->generateQualifiedName("hello")); \
0057     }
0058 
0059 
0060 void KisMetaDataTest::testSchemaBasic()
0061 {
0062     TEST_SCHEMA(TIFFSchemaUri);
0063     TEST_SCHEMA(EXIFSchemaUri);
0064     TEST_SCHEMA(DublinCoreSchemaUri);
0065     TEST_SCHEMA(XMPSchemaUri);
0066     TEST_SCHEMA(XMPRightsSchemaUri);
0067     TEST_SCHEMA(MakerNoteSchemaUri);
0068     TEST_SCHEMA(IPTCSchemaUri);
0069     TEST_SCHEMA(PhotoshopSchemaUri);
0070 }
0071 
0072 
0073 
0074 void KisMetaDataTest::testRationals()
0075 {
0076     {
0077         KisMetaData::Rational sr(-10, -14);
0078         QCOMPARE(sr.numerator, -10);
0079         QCOMPARE(sr.denominator, -14);
0080         KisMetaData::Rational sr2(14, 10);
0081         QVERIFY(sr == sr);
0082         QVERIFY(!(sr == sr2));
0083         QVERIFY(sr != sr2);
0084     }
0085     {
0086         KisMetaData::Rational sr(10, 14);
0087         QCOMPARE(sr.numerator, 10);
0088         QCOMPARE(sr.denominator, 14);
0089         KisMetaData::Rational sr2(14, 10);
0090         QVERIFY(sr == sr);
0091         QVERIFY(!(sr == sr2));
0092         QVERIFY(sr != sr2);
0093     }
0094 }
0095 
0096 void KisMetaDataTest::testValueCreation()
0097 {
0098     {
0099         Value v;
0100         QCOMPARE(v.type(), Value::Invalid);
0101     }
0102     {
0103         Value v(10);
0104         QCOMPARE(v.type(), Value::Variant);
0105         QCOMPARE(v.asVariant().toInt(), 10);
0106         QCOMPARE(v.asInteger(), 10);
0107         QCOMPARE(createIntegerValue().type(), Value::Variant);
0108     }
0109     {
0110         Value v("Hello World !");
0111         QCOMPARE(v.type(), Value::Variant);
0112         QCOMPARE(v.asVariant().toString(), QString("Hello World !"));
0113         QCOMPARE(createStringValue().type(), Value::Variant);
0114     }
0115     {
0116         KisMetaData::Rational sr(42, -12);
0117         Value v(sr);
0118         QCOMPARE(v.type(), Value::Rational);
0119         QCOMPARE(v.asRational(), sr);
0120         QCOMPARE(createRationalValue().type(), Value::Rational);
0121         QCOMPARE(v.asInteger(), -42 / 12);
0122         QCOMPARE(v.asDouble(), -42.0 / 12.0);
0123     }
0124     {
0125         KisMetaData::Rational sr(42, 12);
0126         Value v(sr);
0127         QCOMPARE(v.type(), Value::Rational);
0128         QCOMPARE(v.asRational(), sr);
0129         QCOMPARE(createRationalValue().type(), Value::Rational);
0130         QCOMPARE(v.asInteger(), 42 / 12);
0131         QCOMPARE(v.asDouble(), 42.0 / 12.0);
0132     }
0133     {
0134         QList<Value> list;
0135         list << createRationalValue() << createIntegerValue() << createStringValue();
0136         Value v(list);
0137         QCOMPARE(v.type(), Value::OrderedArray);
0138         QVERIFY(v.isArray());
0139         QCOMPARE(v.asArray(), list);
0140         QCOMPARE(createListValue().type(), Value::OrderedArray);
0141     }
0142     {
0143         Value v(QList<Value>(), Value::OrderedArray);
0144         QCOMPARE(v.type(), Value::OrderedArray);
0145         QVERIFY(v.isArray());
0146     }
0147     {
0148         Value v(QList<Value>(), Value::UnorderedArray);
0149         QCOMPARE(v.type(), Value::UnorderedArray);
0150         QVERIFY(v.isArray());
0151     }
0152     {
0153         Value v(QList<Value>(), Value::AlternativeArray);
0154         QCOMPARE(v.type(), Value::AlternativeArray);
0155         QVERIFY(v.isArray());
0156     }
0157 }
0158 
0159 void KisMetaDataTest::testValueEquality()
0160 {
0161     QVERIFY(createRationalValue() == createRationalValue());
0162     QVERIFY(createIntegerValue() == createIntegerValue());
0163     QVERIFY(createStringValue() == createStringValue());
0164     QVERIFY(createListValue() == createListValue());
0165 }
0166 
0167 
0168 #define TEST_VALUE_COPY(func) \
0169     { \
0170         Value v1 = func(); \
0171         Value v2(v1); \
0172         Value v3 = v1; \
0173         QCOMPARE(v1, v2); \
0174         QCOMPARE(v1, v3); \
0175     }
0176 
0177 void KisMetaDataTest::testValueCopy()
0178 {
0179     TEST_VALUE_COPY(createRationalValue);
0180     TEST_VALUE_COPY(createIntegerValue);
0181     TEST_VALUE_COPY(createStringValue);
0182     TEST_VALUE_COPY(createListValue);
0183 }
0184 void KisMetaDataTest::testEntry()
0185 {
0186     const Schema* schema = SchemaRegistry::instance()->schemaFromUri(KisMetaData::Schema::TIFFSchemaUri);
0187     Value v1 = createIntegerValue(42);
0188     Value v2 = createIntegerValue(12);
0189     Entry e(schema, "test", v1);
0190     QVERIFY(schema);
0191     QCOMPARE(e.name(), QString("test"));
0192     QCOMPARE(e.schema(), schema);
0193     QCOMPARE(e.qualifiedName(), schema->generateQualifiedName("test"));
0194     QCOMPARE(e.value(), v1);
0195     e.value() = v2;
0196     QCOMPARE(e.value(), v2);
0197 }
0198 
0199 void KisMetaDataTest::testStore()
0200 {
0201     const Schema* schema = SchemaRegistry::instance()->schemaFromUri(KisMetaData::Schema::TIFFSchemaUri);
0202     QVERIFY(schema);
0203     Store s;
0204     Entry e(schema, "test", createIntegerValue());
0205     QVERIFY(!s.containsEntry(schema, "test"));
0206     s.addEntry(e);
0207     QVERIFY(s.containsEntry(schema, "test"));
0208     QVERIFY(s.containsEntry(e.qualifiedName()));
0209     QVERIFY(s.containsEntry(KisMetaData::Schema::TIFFSchemaUri, "test"));
0210     s.removeEntry(schema, "test");
0211     QVERIFY(!s.containsEntry(schema, "test"));
0212     Entry& e2 = s.getEntry(schema, "hello");
0213     QVERIFY(s.containsEntry(schema, "hello"));
0214     QVERIFY(e2.name() == "hello");
0215     QVERIFY(e2.schema() == schema);
0216 }
0217 
0218 void KisMetaDataTest::testFilters()
0219 {
0220     // Test anonymizer
0221     {
0222         Store s;
0223         const KisMetaData::Filter* filter = FilterRegistry::instance()->get("Anonymizer");
0224         QVERIFY(filter);
0225         const KisMetaData::Schema* dcSchema = KisMetaData::SchemaRegistry::instance()->schemaFromUri(KisMetaData::Schema::DublinCoreSchemaUri);
0226         QVERIFY(dcSchema);
0227         s.addEntry(Entry(dcSchema, "contributor", Value("somevalue")));
0228         s.addEntry(Entry(dcSchema, "creator", Value("somevalue")));
0229         s.addEntry(Entry(dcSchema, "publisher", Value("somevalue")));
0230         s.addEntry(Entry(dcSchema, "rights", Value("somevalue")));
0231         const KisMetaData::Schema* psSchema = KisMetaData::SchemaRegistry::instance()->schemaFromUri(KisMetaData::Schema::PhotoshopSchemaUri);
0232         s.addEntry(Entry(psSchema, "AuthorsPosition", Value("somevalue")));
0233         s.addEntry(Entry(psSchema, "CaptionWriter", Value("somevalue")));
0234         s.addEntry(Entry(psSchema, "Credit", Value("somevalue")));
0235         s.addEntry(Entry(psSchema, "City", Value("somevalue")));
0236         s.addEntry(Entry(psSchema, "Country", Value("somevalue")));
0237         QList<const KisMetaData::Filter*> filters;
0238         filters << filter;
0239         s.applyFilters(filters);
0240         QVERIFY(!s.containsEntry(dcSchema, "contributor"));
0241         QVERIFY(!s.containsEntry(dcSchema, "creator"));
0242         QVERIFY(!s.containsEntry(dcSchema, "publisher"));
0243         QVERIFY(!s.containsEntry(dcSchema, "rights"));
0244         QVERIFY(!s.containsEntry(psSchema, "AuthorsPosition"));
0245         QVERIFY(!s.containsEntry(psSchema, "CaptionWriter"));
0246         QVERIFY(!s.containsEntry(psSchema, "Credit"));
0247         QVERIFY(!s.containsEntry(psSchema, "City"));
0248         QVERIFY(!s.containsEntry(psSchema, "Country"));
0249     }
0250 }
0251 
0252 void KisMetaDataTest::testTypeInfo()
0253 {
0254     QVERIFY(TypeInfo::Private::Boolean->propertyType() == TypeInfo::BooleanType);
0255     QVERIFY(TypeInfo::Private::Boolean->embeddedPropertyType() == 0);
0256     QVERIFY(TypeInfo::Private::Boolean->choices().size() == 0);
0257     QVERIFY(TypeInfo::Private::Boolean->hasCorrectType(Value(true)));
0258     QVERIFY(!TypeInfo::Private::Boolean->hasCorrectType(createIntegerValue()));
0259     QVERIFY(!TypeInfo::Private::Boolean->hasCorrectType(createStringValue()));
0260     QVERIFY(!TypeInfo::Private::Boolean->hasCorrectType(createListValue()));
0261 
0262     QVERIFY(TypeInfo::Private::Integer->propertyType() == TypeInfo::IntegerType);
0263     QVERIFY(TypeInfo::Private::Integer->embeddedPropertyType() == 0);
0264     QVERIFY(TypeInfo::Private::Integer->choices().size() == 0);
0265     QVERIFY(!TypeInfo::Private::Integer->hasCorrectType(Value(true)));
0266     QVERIFY(TypeInfo::Private::Integer->hasCorrectType(createIntegerValue()));
0267     QVERIFY(!TypeInfo::Private::Integer->hasCorrectType(createStringValue()));
0268     QVERIFY(!TypeInfo::Private::Integer->hasCorrectType(createListValue()));
0269 
0270     QVERIFY(TypeInfo::Private::Text->propertyType() == TypeInfo::TextType);
0271     QVERIFY(TypeInfo::Private::Text->embeddedPropertyType() == 0);
0272     QVERIFY(TypeInfo::Private::Text->choices().size() == 0);
0273     QVERIFY(!TypeInfo::Private::Text->hasCorrectType(Value(true)));
0274     QVERIFY(!TypeInfo::Private::Text->hasCorrectType(createIntegerValue()));
0275     QVERIFY(TypeInfo::Private::Text->hasCorrectType(createStringValue()));
0276     QVERIFY(!TypeInfo::Private::Text->hasCorrectType(createListValue()));
0277 
0278     QVERIFY(TypeInfo::Private::Date->propertyType() == TypeInfo::DateType);
0279     QVERIFY(TypeInfo::Private::Date->embeddedPropertyType() == 0);
0280     QVERIFY(TypeInfo::Private::Date->choices().size() == 0);
0281     QVERIFY(TypeInfo::Private::Date->hasCorrectType(Value(QDateTime())));
0282     QVERIFY(!TypeInfo::Private::Date->hasCorrectType(createIntegerValue()));
0283     QVERIFY(!TypeInfo::Private::Date->hasCorrectType(createStringValue()));
0284     QVERIFY(!TypeInfo::Private::Date->hasCorrectType(createListValue()));
0285 
0286     QVERIFY(TypeInfo::Private::Rational->propertyType() == TypeInfo::RationalType);
0287     QVERIFY(TypeInfo::Private::Rational->embeddedPropertyType() == 0);
0288     QVERIFY(TypeInfo::Private::Rational->choices().size() == 0);
0289     QVERIFY(TypeInfo::Private::Rational->hasCorrectType(createRationalValue()));
0290     QVERIFY(!TypeInfo::Private::Rational->hasCorrectType(createIntegerValue()));
0291     QVERIFY(!TypeInfo::Private::Rational->hasCorrectType(createStringValue()));
0292     QVERIFY(!TypeInfo::Private::Rational->hasCorrectType(createListValue()));
0293 
0294     QVERIFY(TypeInfo::Private::GPSCoordinate->propertyType() == TypeInfo::GPSCoordinateType);
0295     QVERIFY(TypeInfo::Private::GPSCoordinate->embeddedPropertyType() == 0);
0296     QVERIFY(TypeInfo::Private::GPSCoordinate->choices().size() == 0);
0297 
0298     QVERIFY(TypeInfo::Private::LangArray->propertyType() == TypeInfo::LangArrayType);
0299     QVERIFY(TypeInfo::Private::LangArray->embeddedPropertyType() == TypeInfo::Private::Text);
0300     QVERIFY(TypeInfo::Private::LangArray->choices().size() == 0);
0301 
0302     // Create List of integer Value
0303     QList< Value > goodIntegerList;
0304     goodIntegerList.push_back(createIntegerValue());
0305     goodIntegerList.push_back(createIntegerValue(12));
0306     QList< Value > badIntegerList;
0307     badIntegerList.push_back(createIntegerValue());
0308     badIntegerList.push_back(createStringValue());
0309     badIntegerList.push_back(createIntegerValue(12));
0310 
0311     // Test OrderedArray
0312     const TypeInfo* arrOA1 = TypeInfo::Private::orderedArray(TypeInfo::Private::Integer);
0313     QVERIFY(arrOA1->propertyType() == TypeInfo::OrderedArrayType);
0314     QVERIFY(arrOA1->embeddedPropertyType() == TypeInfo::Private::Integer);
0315     QVERIFY(arrOA1->choices().size() == 0);
0316     QVERIFY(arrOA1 == TypeInfo::Private::orderedArray(TypeInfo::Private::Integer));
0317     const TypeInfo* arrOA2 = TypeInfo::Private::orderedArray(TypeInfo::Private::Text);
0318     QVERIFY(arrOA1 != arrOA2);
0319     QVERIFY(arrOA2->embeddedPropertyType() == TypeInfo::Private::Text);
0320     QVERIFY(!arrOA1->hasCorrectType(Value(true)));
0321     QVERIFY(!arrOA1->hasCorrectType(createIntegerValue()));
0322     QVERIFY(!arrOA1->hasCorrectType(createStringValue()));
0323     QVERIFY(!arrOA1->hasCorrectType(createListValue()));
0324     QVERIFY(arrOA1->hasCorrectType(Value(goodIntegerList, Value::OrderedArray)));
0325     QVERIFY(!arrOA1->hasCorrectType(Value(badIntegerList, Value::OrderedArray)));
0326 
0327     // Test UnorderedArray
0328     const TypeInfo* arrUOA1 = TypeInfo::Private::unorderedArray(TypeInfo::Private::Integer);
0329     QVERIFY(arrUOA1->propertyType() == TypeInfo::UnorderedArrayType);
0330     QVERIFY(arrUOA1->embeddedPropertyType() == TypeInfo::Private::Integer);
0331     QVERIFY(arrUOA1->choices().size() == 0);
0332     QVERIFY(arrUOA1 == TypeInfo::Private::unorderedArray(TypeInfo::Private::Integer));
0333     const TypeInfo* arrUOA2 = TypeInfo::Private::unorderedArray(TypeInfo::Private::Text);
0334     QVERIFY(arrUOA1 != arrUOA2);
0335     QVERIFY(arrUOA2->embeddedPropertyType() == TypeInfo::Private::Text);
0336     QVERIFY(arrUOA1 != arrOA1);
0337     QVERIFY(arrUOA2 != arrOA2);
0338     QVERIFY(!arrUOA1->hasCorrectType(Value(true)));
0339     QVERIFY(!arrUOA1->hasCorrectType(createIntegerValue()));
0340     QVERIFY(!arrUOA1->hasCorrectType(createStringValue()));
0341     QVERIFY(!arrUOA1->hasCorrectType(createListValue()));
0342     QVERIFY(arrUOA1->hasCorrectType(Value(goodIntegerList, Value::UnorderedArray)));
0343     QVERIFY(!arrUOA1->hasCorrectType(Value(badIntegerList, Value::UnorderedArray)));
0344 
0345     // Test AlternativeArray
0346     const TypeInfo* arrAA1 = TypeInfo::Private::alternativeArray(TypeInfo::Private::Integer);
0347     QVERIFY(arrAA1->propertyType() == TypeInfo::AlternativeArrayType);
0348     QVERIFY(arrAA1->embeddedPropertyType() == TypeInfo::Private::Integer);
0349     QVERIFY(arrAA1->choices().size() == 0);
0350     QVERIFY(arrAA1 == TypeInfo::Private::alternativeArray(TypeInfo::Private::Integer));
0351     const TypeInfo* arrAA2 = TypeInfo::Private::alternativeArray(TypeInfo::Private::Text);
0352     QVERIFY(arrAA1 != arrAA2);
0353     QVERIFY(arrAA2->embeddedPropertyType() == TypeInfo::Private::Text);
0354     QVERIFY(arrAA1 != arrOA1);
0355     QVERIFY(arrAA1 != arrUOA1);
0356     QVERIFY(arrAA2 != arrOA2);
0357     QVERIFY(arrAA2 != arrUOA2);
0358     QVERIFY(!arrAA1->hasCorrectType(Value(true)));
0359     QVERIFY(!arrAA1->hasCorrectType(createIntegerValue()));
0360     QVERIFY(!arrAA1->hasCorrectType(createStringValue()));
0361     QVERIFY(!arrAA1->hasCorrectType(createListValue()));
0362     QVERIFY(arrAA1->hasCorrectType(Value(goodIntegerList, Value::AlternativeArray)));
0363     QVERIFY(!arrAA1->hasCorrectType(Value(badIntegerList, Value::AlternativeArray)));
0364 
0365     // Test Choice
0366     QList< TypeInfo::Choice > choices;
0367     choices.push_back(TypeInfo::Choice(Value(12), "Hello"));
0368     choices.push_back(TypeInfo::Choice(Value(42), "World"));
0369     const TypeInfo* oChoice = TypeInfo::Private::createChoice(TypeInfo::OpenedChoice, TypeInfo::Private::Integer, choices);
0370     QVERIFY(oChoice->propertyType() == TypeInfo::OpenedChoice);
0371     QVERIFY(oChoice->embeddedPropertyType() == TypeInfo::Private::Integer);
0372     QVERIFY(oChoice->choices().size() == 2);
0373     QVERIFY(oChoice->choices()[0].value() == Value(12));
0374     QVERIFY(oChoice->choices()[0].hint() == "Hello");
0375     QVERIFY(oChoice->choices()[1].value() == Value(42));
0376     QVERIFY(oChoice->choices()[1].hint() == "World");
0377     QVERIFY(!oChoice->hasCorrectType(Value(true)));
0378     QVERIFY(oChoice->hasCorrectType(createIntegerValue(12)));
0379     QVERIFY(oChoice->hasCorrectType(createIntegerValue(-12)));
0380     QVERIFY(oChoice->hasCorrectType(createIntegerValue(42)));
0381     QVERIFY(!oChoice->hasCorrectType(createStringValue()));
0382     QVERIFY(!oChoice->hasCorrectType(createListValue()));
0383     QVERIFY(!oChoice->hasCorrectType(Value(goodIntegerList, Value::AlternativeArray)));
0384     QVERIFY(!oChoice->hasCorrectType(Value(badIntegerList, Value::AlternativeArray)));
0385 
0386     const TypeInfo* cChoice = TypeInfo::Private::createChoice(TypeInfo::ClosedChoice, TypeInfo::Private::Integer, choices);
0387     QVERIFY(cChoice->propertyType() == TypeInfo::ClosedChoice);
0388     QVERIFY(!cChoice->hasCorrectType(Value(true)));
0389     QVERIFY(cChoice->hasCorrectType(createIntegerValue(12)));
0390     QVERIFY(cChoice->hasCorrectType(createIntegerValue(-12)));
0391     QVERIFY(cChoice->hasCorrectType(createIntegerValue(42)));
0392     QVERIFY(!cChoice->hasCorrectType(createStringValue()));
0393     QVERIFY(!cChoice->hasCorrectType(createListValue()));
0394     QVERIFY(!cChoice->hasCorrectType(Value(goodIntegerList, Value::AlternativeArray)));
0395     QVERIFY(!cChoice->hasCorrectType(Value(badIntegerList, Value::AlternativeArray)));
0396     QVERIFY(cChoice->hasCorrectValue(createIntegerValue(12)));
0397     QVERIFY(!cChoice->hasCorrectValue(createIntegerValue(-12)));
0398     QVERIFY(cChoice->hasCorrectValue(createIntegerValue(42)));
0399 
0400     // Test structure
0401 
0402 
0403 }
0404 
0405 void KisMetaDataTest::testSchemaParse()
0406 {
0407     const Schema* exifSchema = SchemaRegistry::instance()->schemaFromUri(Schema::EXIFSchemaUri);
0408     QVERIFY(exifSchema);
0409 
0410     const TypeInfo* colorSpaceType = exifSchema->propertyType("ColorSpace");
0411     QVERIFY(colorSpaceType);
0412     QVERIFY(colorSpaceType->propertyType() == TypeInfo::ClosedChoice);
0413     QVERIFY(colorSpaceType->choices().size() == 2);
0414     QVERIFY(colorSpaceType->choices()[0].value() == Value(1));
0415     QVERIFY(colorSpaceType->choices()[0].hint() == "sRGB");
0416     QVERIFY(colorSpaceType->choices()[1].value() == Value(65635));
0417     QVERIFY(colorSpaceType->choices()[1].hint() == "uncalibrated");
0418 
0419     QVERIFY(exifSchema->propertyType("CompressedBitsPerPixel"));
0420     QVERIFY(exifSchema->propertyType("CompressedBitsPerPixel")->propertyType() == TypeInfo::RationalType);
0421 
0422     QVERIFY(exifSchema->propertyType("PixelXDimension"));
0423     QVERIFY(exifSchema->propertyType("PixelXDimension")->propertyType() == TypeInfo::IntegerType);
0424 
0425     QVERIFY(exifSchema->propertyType("UserComment"));
0426     QVERIFY(exifSchema->propertyType("UserComment")->propertyType() == TypeInfo::LangArrayType);
0427 
0428     QVERIFY(exifSchema->propertyType("RelatedSoundFile"));
0429     QVERIFY(exifSchema->propertyType("RelatedSoundFile")->propertyType() == TypeInfo::TextType);
0430 
0431     QVERIFY(exifSchema->propertyType("DateTimeOriginal"));
0432     QVERIFY(exifSchema->propertyType("DateTimeOriginal")->propertyType() == TypeInfo::DateType);
0433 
0434     QVERIFY(exifSchema->propertyType("ISOSpeedRatings"));
0435     QVERIFY(exifSchema->propertyType("ISOSpeedRatings")->propertyType() == TypeInfo::OrderedArrayType);
0436     QVERIFY(exifSchema->propertyType("ISOSpeedRatings")->embeddedPropertyType() == TypeInfo::Private::Integer);
0437 
0438     const TypeInfo* oecfType = exifSchema->propertyType("OECF");
0439     QVERIFY(oecfType);
0440     QVERIFY(oecfType->propertyType() == TypeInfo::StructureType);
0441     QVERIFY(oecfType == exifSchema->structure("OECFSFR"));
0442     QVERIFY(oecfType->structureName() == "OECFSFR");
0443     QVERIFY(oecfType->structureSchema());
0444     QVERIFY(oecfType->structureSchema()->propertyType("Columns")->propertyType() == TypeInfo::IntegerType);
0445     QVERIFY(oecfType->structureSchema()->propertyType("Rows")->propertyType() == TypeInfo::IntegerType);
0446     QVERIFY(oecfType->structureSchema()->propertyType("Names")->propertyType() == TypeInfo::OrderedArrayType);
0447     QVERIFY(oecfType->structureSchema()->propertyType("Names")->embeddedPropertyType()->propertyType() == TypeInfo::TextType);
0448     QVERIFY(oecfType->structureSchema()->propertyType("Values")->propertyType() == TypeInfo::OrderedArrayType);
0449     QVERIFY(oecfType->structureSchema()->propertyType("Values")->embeddedPropertyType()->propertyType() == TypeInfo::RationalType);
0450 
0451 }
0452 
0453 void KisMetaDataTest::testParser()
0454 {
0455     Value intV = TypeInfo::Private::Integer->parser()->parse("1242");
0456     QVERIFY(intV.type() == Value::Variant);
0457     QVERIFY(intV.asVariant() == 1242);
0458     QVERIFY(intV.asVariant().type() == QVariant::Int);
0459 
0460     Value textV = TypeInfo::Private::Text->parser()->parse("Bouh");
0461     QVERIFY(textV.type() == Value::Variant);
0462     QVERIFY(textV.asVariant() == "Bouh");
0463     QVERIFY(textV.asVariant().type() == QVariant::String);
0464 
0465     Value dateV1 = TypeInfo::Private::Date->parser()->parse("2005-10-31");
0466     QVERIFY(dateV1.type() == Value::Variant);
0467     QDateTime d1 = dateV1.asVariant().toDateTime();
0468     QVERIFY(d1.date().year() == 2005);
0469     QVERIFY(d1.date().month() == 10);
0470     QVERIFY(d1.date().day() == 31);
0471 
0472     Value dateV2 = TypeInfo::Private::Date->parser()->parse("2005");
0473     QVERIFY(dateV2.type() == Value::Variant);
0474     QDateTime d2 = dateV2.asVariant().toDateTime();
0475     QVERIFY(d2.date().year() == 2005);
0476 
0477     Value dateV3 = TypeInfo::Private::Date->parser()->parse("2005-12");
0478     QVERIFY(dateV3.type() == Value::Variant);
0479     QDateTime d3 = dateV3.asVariant().toDateTime();
0480     QVERIFY(d3.date().year() == 2005);
0481     QVERIFY(d3.date().month() == 12);
0482 
0483     Value dateV4 = TypeInfo::Private::Date->parser()->parse("2005-10-31T12:20");
0484     QVERIFY(dateV4.type() == Value::Variant);
0485     QDateTime d4 = dateV4.asVariant().toDateTime();
0486     QVERIFY(d4.date().year() == 2005);
0487     QVERIFY(d4.date().month() == 10);
0488     QVERIFY(d4.date().day() == 31);
0489     QVERIFY(d4.time().hour() == 12);
0490     QVERIFY(d4.time().minute() == 20);
0491 
0492     Value dateV5 = TypeInfo::Private::Date->parser()->parse("2005-10-31T12:20:32");
0493     QVERIFY(dateV5.type() == Value::Variant);
0494     QDateTime d5 = dateV5.asVariant().toDateTime();
0495     QVERIFY(d5.date().year() == 2005);
0496     QVERIFY(d5.date().month() == 10);
0497     QVERIFY(d5.date().day() == 31);
0498     QVERIFY(d5.time().hour() == 12);
0499     QVERIFY(d5.time().minute() == 20);
0500     QVERIFY(d5.time().second() == 32);
0501 
0502     Value rational1 = TypeInfo::Private::Rational->parser()->parse("-10/20");
0503     QVERIFY(rational1.type() == Value::Rational);
0504     QVERIFY(rational1.asRational().numerator == -10);
0505     QVERIFY(rational1.asRational().denominator == 20);
0506 
0507     Value rational2 = TypeInfo::Private::Rational->parser()->parse("10/20");
0508     QVERIFY(rational2.type() == Value::Rational);
0509     QVERIFY(rational2.asRational().numerator == 10);
0510     QVERIFY(rational2.asRational().denominator == 20);
0511 }
0512 
0513 void KisMetaDataTest::testValidator()
0514 {
0515     Store store;
0516     const Schema* exif = SchemaRegistry::instance()->schemaFromUri(Schema::EXIFSchemaUri);
0517     QVERIFY(exif);
0518     store.addEntry(Entry(exif, "PixelXDimension", createIntegerValue()));
0519     store.addEntry(Entry(exif, "PixelYDimension", createIntegerValue()));
0520     store.addEntry(Entry(exif, "RelatedSoundFile", createStringValue()));
0521     store.addEntry(Entry(exif, "ColorSpace", createIntegerValue(1)));
0522     store.addEntry(Entry(exif, "ExposureTime", createRationalValue()));
0523     Validator validator(&store);
0524     QCOMPARE(validator.countInvalidEntries(), 0);
0525     QCOMPARE(validator.countValidEntries(), 5);
0526     QCOMPARE(validator.invalidEntries().size(), 0);
0527 
0528     // Unknown entry
0529     store.addEntry(Entry(exif, "azerty", createIntegerValue()));
0530     validator.revalidate();
0531     QCOMPARE(validator.countInvalidEntries(), 1);
0532     QCOMPARE(validator.countValidEntries(), 5);
0533     QCOMPARE(validator.invalidEntries()[ exif->generateQualifiedName("azerty")].type(), Validator::Reason::UNKNOWN_ENTRY);
0534     store.removeEntry(exif, "azerty");
0535 
0536     // Invalid type for rational
0537     store.addEntry(Entry(exif, "FNumber", createIntegerValue()));
0538     validator.revalidate();
0539     QCOMPARE(validator.countInvalidEntries(), 1);
0540     QCOMPARE(validator.countValidEntries(), 5);
0541     QCOMPARE(validator.invalidEntries()[ exif->generateQualifiedName("FNumber")].type(), Validator::Reason::INVALID_TYPE);
0542     store.removeEntry(exif, "FNumber");
0543 
0544     // Invalid type for integer
0545     store.addEntry(Entry(exif, "SubjectLocation", createStringValue()));
0546     validator.revalidate();
0547     QCOMPARE(validator.countInvalidEntries(), 1);
0548     QCOMPARE(validator.countValidEntries(), 5);
0549     QCOMPARE(validator.invalidEntries()[ exif->generateQualifiedName("SubjectLocation")].type(), Validator::Reason::INVALID_TYPE);
0550     store.removeEntry(exif, "SubjectLocation");
0551 
0552     // Invalid type for choice
0553     store.addEntry(Entry(exif, "SensingMethod", createStringValue()));
0554     validator.revalidate();
0555     QCOMPARE(validator.countInvalidEntries(), 1);
0556     QCOMPARE(validator.countValidEntries(), 5);
0557     QCOMPARE(validator.invalidEntries()[ exif->generateQualifiedName("SensingMethod")].type(), Validator::Reason::INVALID_TYPE);
0558     store.removeEntry(exif, "SensingMethod");
0559 
0560     // Invalid value for choice
0561     store.addEntry(Entry(exif, "SensingMethod", createIntegerValue(1242)));
0562     validator.revalidate();
0563     QCOMPARE(validator.countInvalidEntries(), 1);
0564     QCOMPARE(validator.countValidEntries(), 5);
0565     QCOMPARE(validator.invalidEntries()[ exif->generateQualifiedName("SensingMethod")].type(), Validator::Reason::INVALID_VALUE);
0566     store.removeEntry(exif, "SensingMethod");
0567 
0568 }
0569 
0570 KISTEST_MAIN(KisMetaDataTest)