File indexing completed on 2025-03-09 04:10:04
0001 /* 0002 * SPDX-FileCopyrightText: 2013 Dmitry Kazakov <dimula73@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "kis_linked_pattern_manager_test.h" 0008 0009 #include <simpletest.h> 0010 #include <QPainter> 0011 0012 #include <KoResourceServerProvider.h> 0013 #include <resources/KoPattern.h> 0014 0015 #include "KisEmbeddedTextureData.h" 0016 0017 #include <kis_properties_configuration.h> 0018 #include <KisResourceServerProvider.h> 0019 #include <KisGlobalResourcesInterface.h> 0020 #include <KoResourceServerProvider.h> 0021 #include <KoResourceLoadResult.h> 0022 0023 #include <testresources.h> 0024 0025 KoPatternSP KisLinkedPatternManagerTest::createPattern() 0026 { 0027 QImage image(512, 512, QImage::Format_ARGB32); 0028 image.fill(255); 0029 0030 QPainter gc(&image); 0031 gc.fillRect(100, 100, 312, 312, Qt::red); 0032 0033 KoPatternSP pattern (new KoPattern(image, 0034 "__test_pattern", 0035 KoResourceServerProvider::instance()->patternServer()->saveLocation())); 0036 return pattern; 0037 } 0038 0039 void KisLinkedPatternManagerTest::testRoundTrip() 0040 { 0041 KoPatternSP pattern = createPattern(); 0042 0043 KoResourceServer<KoPattern> *resourceServer = KoResourceServerProvider::instance()->patternServer(); 0044 resourceServer->addResource(pattern, false); 0045 0046 KisPropertiesConfigurationSP config(new KisPropertiesConfiguration); 0047 0048 KisEmbeddedTextureData data1 = KisEmbeddedTextureData::fromPattern(pattern); 0049 data1.write(config.data()); 0050 0051 KisEmbeddedTextureData data2; 0052 data2.read(config.data()); 0053 0054 KoPatternSP newPattern = data2.loadLinkedPattern(KisGlobalResourcesInterface::instance()).resource<KoPattern>(); 0055 0056 QCOMPARE(newPattern->pattern(), pattern->pattern()); 0057 QCOMPARE(newPattern->name(), pattern->name()); 0058 QCOMPARE(QFileInfo(newPattern->filename()).fileName(), 0059 QFileInfo(pattern->filename()).fileName()); 0060 0061 } 0062 0063 void KisLinkedPatternManagerTest::init() 0064 { 0065 QList<KoResourceSP> resourceList; 0066 KisResourceModel *resourceModel = KoResourceServerProvider::instance()->patternServer()->resourceModel(); 0067 for (int row = 0; row < resourceModel->rowCount(); ++row) { 0068 resourceList << resourceModel->resourceForIndex(resourceModel->index(row, 0)); 0069 } 0070 0071 Q_FOREACH(KoResourceSP pa, resourceList) { 0072 if (pa) { 0073 KoResourceServerProvider::instance()->patternServer()->removeResourceFile(pa->filename()); 0074 } 0075 } 0076 } 0077 0078 KisPropertiesConfigurationSP KisLinkedPatternManagerTest::createXML(NameStatus nameStatus, bool hasMd5) 0079 { 0080 0081 KisPropertiesConfigurationSP setting(new KisPropertiesConfiguration); 0082 0083 switch (nameStatus) { 0084 case VALID: { 0085 setting->setProperty("Texture/Pattern/PatternFileName", "./__test_pattern_path.pat"); 0086 setting->setProperty("Texture/Pattern/Name", "__test_pattern"); 0087 break; 0088 } 0089 case PATH: { 0090 QString path = KoResourceServerProvider::instance()->patternServer()->saveLocation() + "/__test_pattern.pat"; 0091 setting->setProperty("Texture/Pattern/PatternFileName", path); 0092 setting->setProperty("Texture/Pattern/Name", "__test_pattern"); 0093 break; 0094 } 0095 case EMPTY: { 0096 setting->setProperty("Texture/Pattern/PatternFileName", "./__test_pattern_path.pat"); 0097 setting->setProperty("Texture/Pattern/Name", ""); 0098 break; 0099 } 0100 } 0101 0102 { 0103 KoPatternSP pattern = createPattern(); 0104 0105 if (hasMd5) { 0106 QString patternMD5 = pattern->md5Sum(); 0107 Q_ASSERT(!patternMD5.isEmpty()); 0108 setting->setProperty("Texture/Pattern/PatternMD5", patternMD5); 0109 } 0110 0111 QBuffer buffer; 0112 buffer.open(QIODevice::WriteOnly); 0113 pattern->pattern().save(&buffer, "PNG"); 0114 setting->setProperty("Texture/Pattern/Pattern", buffer.data().toBase64()); 0115 } 0116 0117 0118 return setting; 0119 } 0120 0121 KoPatternSP findOnServer(const QString &md5) 0122 { 0123 KoPatternSP pattern; 0124 0125 if (!md5.isEmpty()) { 0126 return KoResourceServerProvider::instance()->patternServer()->resource(md5, "", ""); 0127 } 0128 0129 return pattern; 0130 } 0131 0132 void KisLinkedPatternManagerTest::checkOneConfig(NameStatus nameStatus, bool hasMd5, QString expectedName, bool isOnServer) 0133 { 0134 QSharedPointer<KoPattern> basePattern(createPattern()); 0135 0136 KoPatternSP initialPattern = findOnServer(basePattern->md5Sum()); 0137 QCOMPARE((bool)initialPattern, isOnServer); 0138 0139 KisPropertiesConfigurationSP setting = createXML(nameStatus, hasMd5); 0140 0141 KisEmbeddedTextureData data2; 0142 data2.read(setting.data()); 0143 0144 KoPatternSP pattern = data2.loadLinkedPattern(KisGlobalResourcesInterface::instance()).resource<KoPattern>(); 0145 0146 QVERIFY(pattern); 0147 QCOMPARE(pattern->pattern(), basePattern->pattern()); 0148 QVERIFY(pattern->name().startsWith(expectedName)); 0149 0150 QFileInfo info(pattern->filename()); 0151 QVERIFY(info.completeBaseName().startsWith(expectedName)); 0152 QCOMPARE(info.dir().path(), QDir(KoResourceServerProvider::instance()->patternServer()->saveLocation()).path()); 0153 0154 // We can only find things on the server by name or by md5; the file path as an identifier does not work. 0155 if (isOnServer && nameStatus != EMPTY && !hasMd5) { 0156 QCOMPARE(initialPattern, pattern); 0157 } 0158 0159 // will be deleted by the server 0160 // delete pattern; 0161 } 0162 0163 void KisLinkedPatternManagerTest::testLoadingNotOnServerValidName() 0164 { 0165 checkOneConfig(VALID, false, "__test_pattern", false); 0166 } 0167 0168 void KisLinkedPatternManagerTest::testLoadingNotOnServerEmptyName() 0169 { 0170 checkOneConfig(EMPTY, false, "__test_pattern_path", false); 0171 } 0172 0173 void KisLinkedPatternManagerTest::testLoadingNotOnServerPathName() 0174 { 0175 checkOneConfig(PATH, false, "__test_pattern", false); 0176 } 0177 0178 void KisLinkedPatternManagerTest::testLoadingOnServerValidName() 0179 { 0180 KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), false); 0181 checkOneConfig(VALID, false, "__test_pattern", true); 0182 } 0183 0184 void KisLinkedPatternManagerTest::testLoadingOnServerEmptyName() 0185 { 0186 KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), false); 0187 checkOneConfig(EMPTY, false, "__test_pattern_path", true); 0188 } 0189 0190 void KisLinkedPatternManagerTest::testLoadingOnServerPathName() 0191 { 0192 KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), false); 0193 checkOneConfig(PATH, false, "__test_pattern", true); 0194 } 0195 0196 void KisLinkedPatternManagerTest::testLoadingOnServerValidNameMd5() 0197 { 0198 KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), true); 0199 checkOneConfig(VALID, true, "__test_pattern", true); 0200 } 0201 0202 void KisLinkedPatternManagerTest::testLoadingOnServerEmptyNameMd5() 0203 { 0204 KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), true); 0205 checkOneConfig(EMPTY, true, "__test_pattern", true); 0206 } 0207 0208 void KisLinkedPatternManagerTest::testLoadingOnServerPathNameMd5() 0209 { 0210 KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), false); 0211 checkOneConfig(PATH, true, "__test_pattern", true); 0212 } 0213 0214 KISTEST_MAIN(KisLinkedPatternManagerTest)