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"