File indexing completed on 2024-05-12 15:55:35
0001 // SPDX-FileCopyrightText: 2021 Johannes Zarl-Zierl <johannes@zarl-zierl.at> 0002 // 0003 // SPDX-License-Identifier: LicenseRef-KDE-Accepted-GPL 0004 0005 #include "TestFileName.h" 0006 0007 #include "FileName.h" 0008 0009 #include <kpabase/FileNameUtil.h> 0010 #include <kpabase/SettingsData.h> 0011 0012 #include <QRegularExpression> 0013 0014 namespace 0015 { 0016 constexpr auto msgPreconditionFailed = "Precondition for test failed - please fix unit test!"; 0017 } 0018 0019 void KPATest::TestFileName::initTestCase() 0020 { 0021 QVERIFY2(m_tmpDir.isValid(), msgPreconditionFailed); 0022 Settings::SettingsData::setup(m_tmpDir.path(), m_uiDelegate); 0023 } 0024 0025 void KPATest::TestFileName::uninitialized() 0026 { 0027 const DB::FileName nullFN; 0028 QVERIFY(nullFN.isNull()); 0029 } 0030 0031 void KPATest::TestFileName::absolute() 0032 { 0033 QDir imageRoot { Settings::SettingsData::instance()->imageDirectory() }; 0034 using DB::FileName; 0035 0036 // empty filename 0037 const QRegularExpression imageRootWarning { QStringLiteral("Absolute filename is outside of image root:") }; 0038 QTest::ignoreMessage(QtWarningMsg, imageRootWarning); 0039 const auto emptyFN = FileName::fromAbsolutePath({}); 0040 QVERIFY(emptyFN.isNull()); 0041 0042 QTest::ignoreMessage(QtWarningMsg, "Relative or absolute filename cannot be empty!"); 0043 const auto rootFN = FileName::fromAbsolutePath(imageRoot.path() + QStringLiteral("/")); 0044 QVERIFY(rootFN.isNull()); 0045 0046 // incorrect root 0047 const auto outsidePath = QStringLiteral("/notarealdirectory/test.jpg"); 0048 QVERIFY2(!outsidePath.startsWith(m_tmpDir.path()), msgPreconditionFailed); 0049 QTest::ignoreMessage(QtWarningMsg, imageRootWarning); 0050 const auto outsideFN = FileName::fromAbsolutePath(outsidePath); 0051 QVERIFY(outsideFN.isNull()); 0052 0053 // relative filename 0054 QDir cwd; 0055 QTest::ignoreMessage(QtWarningMsg, imageRootWarning); 0056 const auto relativeFN = FileName::fromAbsolutePath(cwd.relativeFilePath(m_tmpDir.path() + QStringLiteral("/test.jpg"))); 0057 QVERIFY(relativeFN.isNull()); 0058 0059 // correct filename 0060 const auto absoluteFilePath = imageRoot.absoluteFilePath(QStringLiteral("atest.jpg")); 0061 const auto correctFN = FileName::fromAbsolutePath(absoluteFilePath); 0062 QVERIFY(!correctFN.isNull()); 0063 QCOMPARE(correctFN.absolute(), absoluteFilePath); 0064 QCOMPARE(correctFN.relative(), imageRoot.relativeFilePath(absoluteFilePath)); 0065 QVERIFY(!correctFN.exists()); 0066 QCOMPARE(correctFN.operator QUrl().toLocalFile(), absoluteFilePath); 0067 0068 const auto sameFN = FileName::fromAbsolutePath(absoluteFilePath); 0069 QVERIFY(sameFN == correctFN); 0070 QVERIFY(sameFN != emptyFN); 0071 0072 const auto relativeCorrectFN = FileName::fromRelativePath(imageRoot.relativeFilePath(absoluteFilePath)); 0073 QVERIFY(!relativeCorrectFN.isNull()); 0074 QCOMPARE(relativeCorrectFN.absolute(), correctFN.absolute()); 0075 QCOMPARE(relativeCorrectFN.relative(), correctFN.relative()); 0076 QVERIFY(relativeCorrectFN == correctFN); 0077 0078 // existing correct filename 0079 QFile existingFile { imageRoot.absoluteFilePath(QStringLiteral("existing.jpg")) }; 0080 QVERIFY2(existingFile.open(QIODevice::WriteOnly), msgPreconditionFailed); 0081 existingFile.close(); 0082 QVERIFY2(existingFile.exists(), msgPreconditionFailed); 0083 const auto existingFN = FileName::fromAbsolutePath(existingFile.fileName()); 0084 QVERIFY(!existingFN.isNull()); 0085 QCOMPARE(existingFN.absolute(), existingFile.fileName()); 0086 QCOMPARE(existingFN.relative(), imageRoot.relativeFilePath(existingFile.fileName())); 0087 QVERIFY(existingFN.exists()); 0088 QVERIFY(correctFN != existingFN); 0089 0090 // alphabetical order 0091 QVERIFY(correctFN < existingFN); 0092 } 0093 0094 void KPATest::TestFileName::relative() 0095 { 0096 QDir imageRoot { Settings::SettingsData::instance()->imageDirectory() }; 0097 0098 using DB::FileName; 0099 0100 // empty filename 0101 QTest::ignoreMessage(QtWarningMsg, "Relative or absolute filename cannot be empty!"); 0102 const auto emptyFN = FileName::fromRelativePath({}); 0103 QVERIFY(emptyFN.isNull()); 0104 0105 // absolute filename 0106 const auto absoluteFilePath = imageRoot.absoluteFilePath(QStringLiteral("atest.jpg")); 0107 const QRegularExpression absolutePathWarning { QStringLiteral("Relative filename cannot start with '/':") }; 0108 QTest::ignoreMessage(QtWarningMsg, absolutePathWarning); 0109 const auto absoluteFN = FileName::fromRelativePath(absoluteFilePath); 0110 QVERIFY(absoluteFN.isNull()); 0111 0112 // correct filename 0113 const auto relativeFilePath = imageRoot.relativeFilePath(absoluteFilePath); 0114 const auto correctFN = FileName::fromRelativePath(relativeFilePath); 0115 QVERIFY(!correctFN.isNull()); 0116 QCOMPARE(correctFN.absolute(), absoluteFilePath); 0117 QCOMPARE(correctFN.relative(), relativeFilePath); 0118 QVERIFY(!correctFN.exists()); 0119 QCOMPARE(correctFN.operator QUrl().toLocalFile(), absoluteFilePath); 0120 0121 const auto sameFN = FileName::fromRelativePath(relativeFilePath); 0122 QVERIFY(sameFN == correctFN); 0123 QVERIFY(sameFN != emptyFN); 0124 0125 const auto absoluteCorrectFN = FileName::fromAbsolutePath(absoluteFilePath); 0126 QVERIFY(!absoluteCorrectFN.isNull()); 0127 QCOMPARE(absoluteCorrectFN.absolute(), correctFN.absolute()); 0128 QCOMPARE(absoluteCorrectFN.relative(), correctFN.relative()); 0129 QVERIFY(absoluteCorrectFN == correctFN); 0130 0131 // existing correct filename 0132 QFile existingFile { imageRoot.relativeFilePath(QStringLiteral("existing.jpg")) }; 0133 QVERIFY2(existingFile.open(QIODevice::WriteOnly), msgPreconditionFailed); 0134 existingFile.close(); 0135 QVERIFY2(existingFile.exists(), msgPreconditionFailed); 0136 const auto existingFN = FileName::fromRelativePath(existingFile.fileName()); 0137 QVERIFY(!existingFN.isNull()); 0138 QCOMPARE(existingFN.absolute(), imageRoot.absoluteFilePath(existingFile.fileName())); 0139 QCOMPARE(existingFN.relative(), existingFile.fileName()); 0140 QVERIFY(existingFN.exists()); 0141 QVERIFY(correctFN != existingFN); 0142 0143 // alphabetical order 0144 QVERIFY(correctFN < existingFN); 0145 } 0146 0147 void KPATest::TestFileName::operators() 0148 { 0149 // empty filename 0150 const auto emptyFN = DB::FileName(); 0151 QVERIFY(emptyFN.isNull()); 0152 QCOMPARE(qHash(emptyFN), qHash(QString())); 0153 0154 // correct filenames 0155 const auto correctFNA = DB::FileName::fromRelativePath(QStringLiteral("a.jpg")); 0156 QVERIFY(correctFNA.isValid()); 0157 const auto correctFNZ = DB::FileName::fromRelativePath(QStringLiteral("z.jpg")); 0158 QVERIFY(correctFNZ.isValid()); 0159 0160 const auto nullComparisonWarning = "FileName for comparison is null!"; 0161 QTest::ignoreMessage(QtWarningMsg, nullComparisonWarning); 0162 QVERIFY(emptyFN < correctFNA); 0163 QTest::ignoreMessage(QtWarningMsg, nullComparisonWarning); 0164 QVERIFY(emptyFN < correctFNZ); 0165 QVERIFY(correctFNA < correctFNZ); 0166 QTest::ignoreMessage(QtWarningMsg, nullComparisonWarning); 0167 QVERIFY(!(correctFNA < emptyFN)); 0168 QTest::ignoreMessage(QtWarningMsg, nullComparisonWarning); 0169 QVERIFY(!(correctFNZ < emptyFN)); 0170 QVERIFY(!(correctFNZ < correctFNA)); 0171 } 0172 0173 QTEST_MAIN(KPATest::TestFileName) 0174 0175 // vi:expandtab:tabstop=4 shiftwidth=4: 0176 0177 #include "moc_TestFileName.cpp"