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)