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)