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

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 <QTest>
0021 
0022 #include "../analysisresults.h"
0023 #include "../checker.h"
0024 #include "../issue.h"
0025 
0026 class AnalysisResultsTest: public QObject {
0027 Q_OBJECT
0028 private slots:
0029 
0030     void testAddChecker();
0031     void testAddCheckerWithSameName();
0032     void testFindCheckerNotFound();
0033 
0034     void testAddIssue();
0035 
0036     void testAddAnalysisResults();
0037     void testAddAnalysisResultsWithDuplicatedIssues();
0038 
0039 };
0040 
0041 void AnalysisResultsTest::testAddChecker() {
0042     auto  checker1 = new Checker();
0043     checker1->setFileType("fileType1");
0044     checker1->setName("name1");
0045 
0046     auto  checker2 = new Checker();
0047     checker2->setFileType("fileType1");
0048     checker2->setName("name2");
0049 
0050     auto  checker3 = new Checker();
0051     checker3->setFileType("fileType2");
0052     checker3->setName("name1");
0053 
0054     AnalysisResults analysisResults;
0055     analysisResults.addChecker(checker1);
0056     analysisResults.addChecker(checker2);
0057     analysisResults.addChecker(checker3);
0058 
0059     QCOMPARE(analysisResults.findChecker("fileType1", "name1"), checker1);
0060     QCOMPARE(analysisResults.findChecker("fileType1", "name2"), checker2);
0061     QCOMPARE(analysisResults.findChecker("fileType2", "name1"), checker3);
0062 }
0063 
0064 void AnalysisResultsTest::testAddCheckerWithSameName() {
0065     auto  checker1 = new Checker();
0066     checker1->setFileType("fileType");
0067     checker1->setName("name");
0068 
0069     //It won't be added to the AnalysisResults, so it is created in the stack to
0070     //be automatically deleted
0071     Checker checker2;
0072     checker2.setFileType("fileType");
0073     checker2.setName("name");
0074 
0075     AnalysisResults analysisResults;
0076     analysisResults.addChecker(checker1);
0077     analysisResults.addChecker(&checker2);
0078 
0079     QCOMPARE(analysisResults.findChecker("fileType", "name"), checker1);
0080 }
0081 
0082 void AnalysisResultsTest::testFindCheckerNotFound() {
0083     auto  checker1 = new Checker();
0084     checker1->setFileType("fileType");
0085     checker1->setName("name");
0086 
0087     AnalysisResults analysisResults;
0088     analysisResults.addChecker(checker1);
0089 
0090     QCOMPARE(analysisResults.findChecker("fileType", "nameNotAdded"), (Checker*)nullptr);
0091 }
0092 
0093 void AnalysisResultsTest::testAddIssue() {
0094     auto  checker1 = new Checker();
0095     checker1->setFileType("fileType");
0096     checker1->setName("name1");
0097     auto  issue1 = new Issue();
0098     issue1->setChecker(checker1);
0099     issue1->setFileName("fileName");
0100 
0101     auto  checker2 = new Checker();
0102     checker2->setFileType("fileType");
0103     checker2->setName("name2");
0104     auto  issue2a = new Issue();
0105     issue2a->setChecker(checker2);
0106     issue2a->setFileName("fileName");
0107     auto  issue2b = new Issue();
0108     issue2b->setChecker(checker2);
0109     issue2b->setFileName("fileName");
0110 
0111     AnalysisResults analysisResults;
0112     analysisResults.addChecker(checker1);
0113     analysisResults.addIssue(issue1);
0114     analysisResults.addChecker(checker2);
0115     analysisResults.addIssue(issue2a);
0116     analysisResults.addIssue(issue2b);
0117 
0118     QCOMPARE(analysisResults.issues().size(), 3);
0119     QCOMPARE(analysisResults.issues()[0], issue1);
0120     QCOMPARE(analysisResults.issues()[1], issue2a);
0121     QCOMPARE(analysisResults.issues()[2], issue2b);
0122 }
0123 
0124 void AnalysisResultsTest::testAddAnalysisResults() {
0125     auto  fileType1Checker1 = new Checker();
0126     fileType1Checker1->setFileType("fileType1");
0127     fileType1Checker1->setName("fileType1Checker1Name");
0128     auto  fileType1Checker1Issue1 = new Issue();
0129     fileType1Checker1Issue1->setChecker(fileType1Checker1);
0130     fileType1Checker1Issue1->setFileName("fileType1Checker1Issue1FileName");
0131 
0132     auto  fileType1Checker2 = new Checker();
0133     fileType1Checker2->setFileType("fileType1");
0134     fileType1Checker2->setName("fileType1Checker2Name");
0135     auto  fileType1Checker2Issue2a = new Issue();
0136     fileType1Checker2Issue2a->setChecker(fileType1Checker2);
0137     fileType1Checker2Issue2a->setFileName("fileType1Checker2Issue2aFileName");
0138     auto  fileType1Checker2Issue2b = new Issue();
0139     fileType1Checker2Issue2b->setChecker(fileType1Checker2);
0140     fileType1Checker2Issue2b->setFileName("fileType1Checker2Issue2bFileName");
0141 
0142     AnalysisResults analysisResults;
0143     analysisResults.addChecker(fileType1Checker1);
0144     analysisResults.addIssue(fileType1Checker1Issue1);
0145     analysisResults.addChecker(fileType1Checker2);
0146     analysisResults.addIssue(fileType1Checker2Issue2a);
0147     analysisResults.addIssue(fileType1Checker2Issue2b);
0148 
0149     //Other AnalysisResults with different checkers and issues
0150     auto  fileType2Checker1 = new Checker();
0151     fileType2Checker1->setFileType("fileType2");
0152     fileType2Checker1->setName("fileType2Checker1Name");
0153     fileType2Checker1->setDescription("fileType2Checker1Description");
0154     fileType2Checker1->setExplanation("fileType2Checker1Explanation");
0155     fileType2Checker1->setExtra(true);
0156     auto  fileType2Checker1Issue1 = new Issue();
0157     fileType2Checker1Issue1->setChecker(fileType2Checker1);
0158     fileType2Checker1Issue1->setFileName("fileType2Checker1Issue1FileName");
0159     fileType2Checker1Issue1->setLine(4);
0160     fileType2Checker1Issue1->setMessage("fileType2Checker1Issue1Message");
0161 
0162     auto  fileType2Checker2 = new Checker();
0163     fileType2Checker2->setFileType("fileType2");
0164     fileType2Checker2->setName("fileType2Checker2Name");
0165     fileType2Checker2->setDescription("fileType2Checker2Description");
0166     fileType2Checker2->setExplanation("fileType2Checker2Explanation");
0167     auto  fileType2Checker2Issue2a = new Issue();
0168     fileType2Checker2Issue2a->setChecker(fileType2Checker2);
0169     fileType2Checker2Issue2a->setFileName("fileType2Checker2Issue2aFileName");
0170     fileType2Checker2Issue2a->setLine(8);
0171     fileType2Checker2Issue2a->setMessage("fileType2Checker2Issue2aMessage");
0172     auto  fileType2Checker2Issue2b = new Issue();
0173     fileType2Checker2Issue2b->setChecker(fileType2Checker2);
0174     fileType2Checker2Issue2b->setFileName("fileType2Checker2Issue2bFileName");
0175     fileType2Checker2Issue2b->setLine(15);
0176     fileType2Checker2Issue2b->setMessage("fileType2Checker2Issue2bMessage");
0177 
0178     //An issue with a checker with the same file type and name as one already
0179     //added
0180     auto  fileType1Checker1ToAdd = new Checker();
0181     fileType1Checker1ToAdd->setFileType("fileType1");
0182     fileType1Checker1ToAdd->setName("fileType1Checker1Name");
0183     auto  fileType1Checker1Issue2 = new Issue();
0184     fileType1Checker1Issue2->setChecker(fileType1Checker1ToAdd);
0185     fileType1Checker1Issue2->setFileName("fileType1Checker1Issue2FileName");
0186     fileType1Checker1Issue2->setLine(16);
0187     fileType1Checker1Issue2->setMessage("fileType1Checker1Issue2Message");
0188 
0189     AnalysisResults analysisResultsToAdd;
0190     analysisResultsToAdd.addChecker(fileType2Checker1);
0191     analysisResultsToAdd.addIssue(fileType2Checker1Issue1);
0192     analysisResultsToAdd.addChecker(fileType2Checker2);
0193     analysisResultsToAdd.addIssue(fileType2Checker2Issue2a);
0194     analysisResultsToAdd.addIssue(fileType2Checker2Issue2b);
0195     analysisResultsToAdd.addChecker(fileType1Checker1ToAdd);
0196     analysisResultsToAdd.addIssue(fileType1Checker1Issue2);
0197 
0198     analysisResults.addAnalysisResults(&analysisResultsToAdd);
0199 
0200     QCOMPARE(analysisResults.issues().size(), 7);
0201     QCOMPARE(analysisResults.issues()[0], fileType1Checker1Issue1);
0202     QCOMPARE(analysisResults.issues()[0]->checker(), fileType1Checker1);
0203     QCOMPARE(analysisResults.issues()[1], fileType1Checker2Issue2a);
0204     QCOMPARE(analysisResults.issues()[1]->checker(), fileType1Checker2);
0205     QCOMPARE(analysisResults.issues()[2], fileType1Checker2Issue2b);
0206     QCOMPARE(analysisResults.issues()[2]->checker(), fileType1Checker2);
0207 
0208     const Issue* newFileType2Checker1Issue1 = analysisResults.issues()[3];
0209     QVERIFY(newFileType2Checker1Issue1 != fileType2Checker1Issue1);
0210     QCOMPARE(newFileType2Checker1Issue1->fileName(), QString("fileType2Checker1Issue1FileName"));
0211     QCOMPARE(newFileType2Checker1Issue1->line(), 4);
0212     QCOMPARE(newFileType2Checker1Issue1->message(), QString("fileType2Checker1Issue1Message"));
0213     const Checker* newFileType2Checker1 = newFileType2Checker1Issue1->checker();
0214     QVERIFY(newFileType2Checker1 != fileType2Checker1);
0215     QCOMPARE(newFileType2Checker1->fileType(), QString("fileType2"));
0216     QCOMPARE(newFileType2Checker1->name(), QString("fileType2Checker1Name"));
0217     QCOMPARE(newFileType2Checker1->description(), QString("fileType2Checker1Description"));
0218     QCOMPARE(newFileType2Checker1->explanation(), QString("fileType2Checker1Explanation"));
0219     QCOMPARE(newFileType2Checker1->isExtra(), true);
0220 
0221     const Issue* newFileType2Checker2Issue2a = analysisResults.issues()[4];
0222     QVERIFY(newFileType2Checker2Issue2a != fileType2Checker2Issue2a);
0223     QCOMPARE(newFileType2Checker2Issue2a->fileName(), QString("fileType2Checker2Issue2aFileName"));
0224     QCOMPARE(newFileType2Checker2Issue2a->line(), 8);
0225     QCOMPARE(newFileType2Checker2Issue2a->message(), QString("fileType2Checker2Issue2aMessage"));
0226     const Checker* newFileType2Checker2 = newFileType2Checker2Issue2a->checker();
0227     QVERIFY(newFileType2Checker2 != fileType2Checker2);
0228     QCOMPARE(newFileType2Checker2->fileType(), QString("fileType2"));
0229     QCOMPARE(newFileType2Checker2->name(), QString("fileType2Checker2Name"));
0230     QCOMPARE(newFileType2Checker2->description(), QString("fileType2Checker2Description"));
0231     QCOMPARE(newFileType2Checker2->explanation(), QString("fileType2Checker2Explanation"));
0232 
0233     const Issue* newFileType2Checker2Issue2b = analysisResults.issues()[5];
0234     QVERIFY(newFileType2Checker2Issue2b != fileType2Checker2Issue2b);
0235     QCOMPARE(newFileType2Checker2Issue2b->fileName(), QString("fileType2Checker2Issue2bFileName"));
0236     QCOMPARE(newFileType2Checker2Issue2b->line(), 15);
0237     QCOMPARE(newFileType2Checker2Issue2b->message(), QString("fileType2Checker2Issue2bMessage"));
0238     QVERIFY(newFileType2Checker2Issue2b->checker() == newFileType2Checker2);
0239 
0240     const Issue* newFileType1Checker1Issue2 = analysisResults.issues()[6];
0241     QVERIFY(newFileType1Checker1Issue2 != fileType1Checker1Issue2);
0242     QCOMPARE(newFileType1Checker1Issue2->fileName(), QString("fileType1Checker1Issue2FileName"));
0243     QCOMPARE(newFileType1Checker1Issue2->line(), 16);
0244     QCOMPARE(newFileType1Checker1Issue2->message(), QString("fileType1Checker1Issue2Message"));
0245     QVERIFY(newFileType1Checker1Issue2->checker() == fileType1Checker1);
0246 }
0247 
0248 void AnalysisResultsTest::testAddAnalysisResultsWithDuplicatedIssues() {
0249     auto  checker1 = new Checker();
0250     checker1->setFileType("fileType");
0251     checker1->setName("name1");
0252     auto  issue1 = new Issue();
0253     issue1->setChecker(checker1);
0254     issue1->setFileName("fileName");
0255     auto  issue2 = new Issue();
0256     issue2->setChecker(checker1);
0257     issue2->setFileName("fileName");
0258     issue2->setLine(42);
0259 
0260     AnalysisResults analysisResults;
0261     analysisResults.addChecker(checker1);
0262     analysisResults.addIssue(issue1);
0263     analysisResults.addIssue(issue2);
0264 
0265     //Other AnalysisResults with repeated checkers and issues
0266     auto  checker1b = new Checker();
0267     checker1b->setFileType("fileType");
0268     checker1b->setName("name1");
0269     auto  issue1DifferentChecker = new Issue();
0270     issue1DifferentChecker->setChecker(checker1b);
0271     issue1DifferentChecker->setFileName("fileName");
0272     auto  issue2DifferentChecker = new Issue();
0273     issue2DifferentChecker->setChecker(checker1b);
0274     issue2DifferentChecker->setFileName("fileName");
0275     issue2DifferentChecker->setLine(42);
0276     auto  issue3DifferentChecker = new Issue();
0277     issue3DifferentChecker->setChecker(checker1b);
0278     issue3DifferentChecker->setFileName("fileName2");
0279     issue3DifferentChecker->setLine(108);
0280 
0281     AnalysisResults analysisResultsToAdd;
0282     analysisResultsToAdd.addChecker(checker1b);
0283     analysisResultsToAdd.addIssue(issue1DifferentChecker);
0284     analysisResultsToAdd.addIssue(issue2DifferentChecker);
0285     analysisResultsToAdd.addIssue(issue3DifferentChecker);
0286 
0287     analysisResults.addAnalysisResults(&analysisResultsToAdd);
0288 
0289     QCOMPARE(analysisResults.issues().size(), 3);
0290     QCOMPARE(analysisResults.issues()[0], issue1);
0291     QCOMPARE(analysisResults.issues()[0]->checker(), checker1);
0292     QCOMPARE(analysisResults.issues()[1], issue2);
0293     QCOMPARE(analysisResults.issues()[1]->checker(), checker1);
0294 
0295     const Issue* newIssue3 = analysisResults.issues()[2];
0296     QVERIFY(newIssue3 != issue3DifferentChecker);
0297     QCOMPARE(newIssue3->fileName(), QString("fileName2"));
0298     QCOMPARE(newIssue3->line(), 108);
0299     QCOMPARE(newIssue3->checker(), checker1);
0300 }
0301 
0302 QTEST_GUILESS_MAIN(AnalysisResultsTest)
0303 
0304 #include "analysisresultstest.moc"