File indexing completed on 2024-05-05 04:35:27

0001 /*
0002  * This file is part of KDevelop Krazy2 Plugin.
0003  *
0004  * Copyright 2012 Daniel Calviño Sánchez <danxuliu@gmail.com>
0005  *
0006  * This program is free software; you can redistribute it and/or
0007  * modify it under the terms of the GNU General Public License
0008  * as published by the Free Software Foundation; either version 2
0009  * of the License, or (at your option) any later version.
0010  *
0011  * This program is distributed in the hope that it will be useful,
0012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0014  * GNU General Public License for more details.
0015  *
0016  * You should have received a copy of the GNU General Public License
0017  * along with this program. If not, see <http://www.gnu.org/licenses/>.
0018  */
0019 
0020 #include <QtTest>
0021 
0022 #include "../analysisparameters.h"
0023 #include "../checker.h"
0024 
0025 class AnalysisParametersTest: public QObject {
0026 Q_OBJECT
0027 private slots:
0028 
0029     void initTestCase();
0030 
0031     void testConstructor();
0032 
0033     void testInitializeCheckers();
0034     void testInitializeCheckersWhenNoAvailableCheckers();
0035 
0036     void testSetCheckersToRun();
0037     void testSetCheckersToRunWithNotAvailableCheckers();
0038 
0039     void testSetFilesAndDirectories();
0040     void testSetFilesAndDirectoriesWithRepeatedEntries();
0041     void testSetFilesAndDirectoriesWithInvalidEntries();
0042 
0043 private:
0044 
0045     QList<const Checker*> createAvailableCheckers() const;
0046 
0047     bool examplesInSubdirectory() const;
0048 
0049     QString m_examplesPath;
0050 };
0051 
0052 void AnalysisParametersTest::initTestCase()
0053 {
0054     m_examplesPath = QStringLiteral(EXAMPLETESTDATA_PATH);
0055 }
0056 
0057 void AnalysisParametersTest::testConstructor() {
0058     AnalysisParameters analysisparameters;
0059 
0060     QVERIFY(!analysisparameters.wereCheckersInitialized());
0061     QVERIFY(analysisparameters.availableCheckers().isEmpty());
0062     QVERIFY(analysisparameters.checkersToRun().isEmpty());
0063     QVERIFY(analysisparameters.filesToBeAnalyzed().isEmpty());
0064 }
0065 
0066 void AnalysisParametersTest::testInitializeCheckers() {
0067     AnalysisParameters analysisparameters;
0068     QList<const Checker*> availableCheckers = createAvailableCheckers();
0069 
0070     analysisparameters.initializeCheckers(availableCheckers);
0071 
0072     QVERIFY(analysisparameters.wereCheckersInitialized());
0073     QCOMPARE(analysisparameters.availableCheckers(), availableCheckers);
0074     QCOMPARE(analysisparameters.checkersToRun().count(), 3);
0075     QCOMPARE(analysisparameters.checkersToRun().at(0),
0076              analysisparameters.availableCheckers().at(0));
0077     QCOMPARE(analysisparameters.checkersToRun().at(1),
0078              analysisparameters.availableCheckers().at(1));
0079     QCOMPARE(analysisparameters.checkersToRun().at(2),
0080              analysisparameters.availableCheckers().at(3));
0081 }
0082 
0083 void AnalysisParametersTest::testInitializeCheckersWhenNoAvailableCheckers() {
0084     AnalysisParameters analysisparameters;
0085     QList<const Checker*> availableCheckers;
0086 
0087     analysisparameters.initializeCheckers(availableCheckers);
0088 
0089     QVERIFY(analysisparameters.wereCheckersInitialized());
0090     QCOMPARE(analysisparameters.availableCheckers(), availableCheckers);
0091     QCOMPARE(analysisparameters.checkersToRun().count(), 0);
0092 }
0093 
0094 void AnalysisParametersTest::testSetCheckersToRun() {
0095     AnalysisParameters analysisparameters;
0096     QList<const Checker*> availableCheckers = createAvailableCheckers();
0097     analysisparameters.initializeCheckers(availableCheckers);
0098 
0099     QList<const Checker*> checkersToRun;
0100     checkersToRun.append(availableCheckers.at(1));
0101     checkersToRun.append(availableCheckers.at(2));
0102     checkersToRun.append(availableCheckers.at(4));
0103 
0104     analysisparameters.setCheckersToRun(checkersToRun);
0105 
0106     QVERIFY(analysisparameters.wereCheckersInitialized());
0107     QCOMPARE(analysisparameters.availableCheckers(), availableCheckers);
0108     QCOMPARE(analysisparameters.checkersToRun().count(), 3);
0109     QCOMPARE(analysisparameters.checkersToRun().at(0),
0110              analysisparameters.availableCheckers().at(1));
0111     QCOMPARE(analysisparameters.checkersToRun().at(1),
0112              analysisparameters.availableCheckers().at(2));
0113     QCOMPARE(analysisparameters.checkersToRun().at(2),
0114              analysisparameters.availableCheckers().at(4));
0115 }
0116 
0117 void AnalysisParametersTest::testSetCheckersToRunWithNotAvailableCheckers() {
0118     AnalysisParameters analysisparameters;
0119 
0120     QScopedPointer<Checker> checkerNotAvailable(new Checker());
0121     checkerNotAvailable->setFileType("fileType1");
0122     checkerNotAvailable->setName("checkerNotAvailableName");
0123 
0124     QList<const Checker*> checkersToRun;
0125     checkersToRun.append(checkerNotAvailable.data());
0126 
0127     analysisparameters.setCheckersToRun(checkersToRun);
0128 
0129     QVERIFY(!analysisparameters.wereCheckersInitialized());
0130     QVERIFY(analysisparameters.availableCheckers().isEmpty());
0131     QVERIFY(analysisparameters.checkersToRun().isEmpty());
0132 
0133     QList<const Checker*> availableCheckers = createAvailableCheckers();
0134     analysisparameters.initializeCheckers(availableCheckers);
0135 
0136     checkersToRun.clear();
0137     checkersToRun.append(availableCheckers.at(1));
0138     checkersToRun.append(availableCheckers.at(2));
0139     checkersToRun.append(checkerNotAvailable.data());
0140     checkersToRun.append(availableCheckers.at(4));
0141 
0142     analysisparameters.setCheckersToRun(checkersToRun);
0143 
0144     QVERIFY(analysisparameters.wereCheckersInitialized());
0145     QCOMPARE(analysisparameters.availableCheckers(), availableCheckers);
0146     QCOMPARE(analysisparameters.checkersToRun().count(), 3);
0147     QCOMPARE(analysisparameters.checkersToRun().at(0),
0148              analysisparameters.availableCheckers().at(1));
0149     QCOMPARE(analysisparameters.checkersToRun().at(1),
0150              analysisparameters.availableCheckers().at(2));
0151     QCOMPARE(analysisparameters.checkersToRun().at(2),
0152              analysisparameters.availableCheckers().at(4));
0153 }
0154 
0155 void AnalysisParametersTest::testSetFilesAndDirectories() {
0156     if (!examplesInSubdirectory()) {
0157         QString message = "The examples were not found in the 'examples' directory (" + m_examplesPath + ')';
0158         QSKIP(message.toLatin1(), SkipAll);
0159     }
0160 
0161     AnalysisParameters analysisparameters;
0162 
0163     QStringList paths;
0164     paths.append(m_examplesPath + QString::fromUtf8("singleIssueNonAsciiFileNameḶḷambión.cpp"));
0165     paths.append(m_examplesPath + ".singleIssueHiddenUnixFileName.cpp");
0166     paths.append(m_examplesPath + "subdirectory");
0167     paths.append(m_examplesPath + "severalIssuesSeveralCheckers.cpp");
0168     analysisparameters.setFilesAndDirectories(paths);
0169 
0170     QCOMPARE(analysisparameters.filesAndDirectories(), paths);
0171 
0172     QStringList filesToBeAnalyzed = analysisparameters.filesToBeAnalyzed();
0173     QCOMPARE(filesToBeAnalyzed.count(), 5);
0174     QVERIFY(filesToBeAnalyzed.contains(
0175             m_examplesPath + QString::fromUtf8("singleIssueNonAsciiFileNameḶḷambión.cpp")));
0176     QVERIFY(filesToBeAnalyzed.contains
0177             (m_examplesPath + ".singleIssueHiddenUnixFileName.cpp"));
0178     QVERIFY(filesToBeAnalyzed.contains(
0179             m_examplesPath + "subdirectory/singleIssue.desktop"));
0180     QVERIFY(filesToBeAnalyzed.contains(
0181             m_examplesPath + "subdirectory/severalIssuesSeveralCheckers.qml"));
0182     QVERIFY(filesToBeAnalyzed.contains(
0183             m_examplesPath + "severalIssuesSeveralCheckers.cpp"));
0184 }
0185 
0186 void AnalysisParametersTest::testSetFilesAndDirectoriesWithRepeatedEntries() {
0187     if (!examplesInSubdirectory()) {
0188         QString message = "The examples were not found in the 'examples' directory (" + m_examplesPath + ')';
0189         QSKIP(message.toLatin1(), SkipAll);
0190     }
0191 
0192     AnalysisParameters analysisparameters;
0193 
0194     QStringList paths;
0195     paths.append(m_examplesPath + "singleIssue.cpp");
0196     paths.append(m_examplesPath);
0197     paths.append(m_examplesPath + "singleIssue.cpp");
0198     paths.append(m_examplesPath + "severalIssuesSeveralCheckers.cpp");
0199     analysisparameters.setFilesAndDirectories(paths);
0200 
0201     QCOMPARE(analysisparameters.filesAndDirectories(), paths);
0202 
0203     QStringList filesToBeAnalyzed = analysisparameters.filesToBeAnalyzed();
0204     QCOMPARE(filesToBeAnalyzed.count(), 9);
0205     QVERIFY(filesToBeAnalyzed.contains(
0206             m_examplesPath + "singleIssue.cpp"));
0207     QVERIFY(filesToBeAnalyzed.contains(
0208             m_examplesPath + "singleExtraIssue.cpp"));
0209     QVERIFY(filesToBeAnalyzed.contains(
0210             m_examplesPath + QString::fromUtf8("singleIssueNonAsciiFileNameḶḷambión.cpp")));
0211     QVERIFY(filesToBeAnalyzed.contains(
0212             m_examplesPath + ".singleIssueHiddenUnixFileName.cpp"));
0213     QVERIFY(filesToBeAnalyzed.contains(
0214             m_examplesPath + "severalIssuesSingleChecker.cpp"));
0215     QVERIFY(filesToBeAnalyzed.contains(
0216             m_examplesPath + "severalIssuesSeveralCheckers.cpp"));
0217     QVERIFY(filesToBeAnalyzed.contains(
0218             m_examplesPath + "severalIssuesSeveralCheckersUnknownFileType.dqq"));
0219     QVERIFY(filesToBeAnalyzed.contains(
0220             m_examplesPath + "subdirectory/singleIssue.desktop"));
0221     QVERIFY(filesToBeAnalyzed.contains(
0222             m_examplesPath + "subdirectory/severalIssuesSeveralCheckers.qml"));
0223 }
0224 
0225 void AnalysisParametersTest::testSetFilesAndDirectoriesWithInvalidEntries() {
0226     if (!examplesInSubdirectory()) {
0227         QString message = "The examples were not found in the 'examples' directory (" + m_examplesPath + ')';
0228         QSKIP(message.toLatin1(), SkipAll);
0229     }
0230 
0231     AnalysisParameters analysisparameters;
0232 
0233     QStringList paths;
0234     paths.append(m_examplesPath + QString::fromUtf8("singleIssueNonAsciiFileNameḶḷambión.cpp"));
0235     paths.append(m_examplesPath + ".singleIssueHiddenUnixFileName.cpp");
0236     paths.append("http://someServer.com/remoteFile.cpp");
0237     paths.append(m_examplesPath + "subdirectory");
0238     paths.append(m_examplesPath + "aFileThatDoesNotExist.cpp");
0239     paths.append(m_examplesPath + "severalIssuesSeveralCheckers.cpp");
0240     analysisparameters.setFilesAndDirectories(paths);
0241 
0242     QCOMPARE(analysisparameters.filesAndDirectories(), paths);
0243 
0244     QStringList filesToBeAnalyzed = analysisparameters.filesToBeAnalyzed();
0245     QCOMPARE(filesToBeAnalyzed.count(), 5);
0246     QVERIFY(filesToBeAnalyzed.contains(
0247             m_examplesPath + QString::fromUtf8("singleIssueNonAsciiFileNameḶḷambión.cpp")));
0248     QVERIFY(filesToBeAnalyzed.contains
0249             (m_examplesPath + ".singleIssueHiddenUnixFileName.cpp"));
0250     QVERIFY(filesToBeAnalyzed.contains(
0251             m_examplesPath + "subdirectory/singleIssue.desktop"));
0252     QVERIFY(filesToBeAnalyzed.contains(
0253             m_examplesPath + "subdirectory/severalIssuesSeveralCheckers.qml"));
0254     QVERIFY(filesToBeAnalyzed.contains(
0255             m_examplesPath + "severalIssuesSeveralCheckers.cpp"));
0256 }
0257 
0258 ///////////////////////////////// Helpers //////////////////////////////////////
0259 
0260 QList<const Checker*> AnalysisParametersTest::createAvailableCheckers() const {
0261     QList<const Checker*> checkers;
0262 
0263     auto  fileType1Checker1 = new Checker();
0264     fileType1Checker1->setFileType("fileType1");
0265     fileType1Checker1->setName("checker1Name");
0266     checkers.append(fileType1Checker1);
0267 
0268     auto  fileType1Checker2 = new Checker();
0269     fileType1Checker2->setFileType("fileType1");
0270     fileType1Checker2->setName("checker2Name");
0271     checkers.append(fileType1Checker2);
0272 
0273     auto  fileType1ExtraChecker1 = new Checker();
0274     fileType1ExtraChecker1->setFileType("fileType1");
0275     fileType1ExtraChecker1->setName("extraChecker1Name");
0276     fileType1ExtraChecker1->setExtra(true);
0277     checkers.append(fileType1ExtraChecker1);
0278 
0279     auto  fileType2Checker1 = new Checker();
0280     fileType2Checker1->setFileType("fileType2");
0281     fileType2Checker1->setName("checker1Name");
0282     checkers.append(fileType2Checker1);
0283 
0284     auto  fileType2ExtraChecker1 = new Checker();
0285     fileType2ExtraChecker1->setFileType("fileType2");
0286     fileType2ExtraChecker1->setName("extraChecker1Name");
0287     fileType2ExtraChecker1->setExtra(true);
0288     checkers.append(fileType2ExtraChecker1);
0289 
0290     return checkers;
0291 }
0292 
0293 bool AnalysisParametersTest::examplesInSubdirectory() const {
0294     if (QFile(m_examplesPath + "singleIssue.cpp").exists() &&
0295         QFile(m_examplesPath + "singleExtraIssue.cpp").exists() &&
0296         QFile(m_examplesPath + QString::fromUtf8("singleIssueNonAsciiFileNameḶḷambión.cpp")).exists() &&
0297         QFile(m_examplesPath + ".singleIssueHiddenUnixFileName.cpp").exists() &&
0298         QFile(m_examplesPath + "severalIssuesSingleChecker.cpp").exists() &&
0299         QFile(m_examplesPath + "severalIssuesSeveralCheckers.cpp").exists() &&
0300         QFile(m_examplesPath + "severalIssuesSeveralCheckersUnknownFileType.dqq").exists() &&
0301         QFile(m_examplesPath + "subdirectory/singleIssue.desktop").exists() &&
0302         QFile(m_examplesPath + "subdirectory/severalIssuesSeveralCheckers.qml").exists()) {
0303         return true;
0304     }
0305 
0306     return false;
0307 }
0308 
0309 QTEST_GUILESS_MAIN(AnalysisParametersTest)
0310 
0311 #include "analysisparameterstest.moc"