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 "../checkerlistparser.h"
0023 #include "../checker.h"
0024 
0025 #include <time.h>
0026 
0027 class CheckerListParserTest: public QObject {
0028 Q_OBJECT
0029 private slots:
0030 
0031     void init();
0032     void cleanup();
0033 
0034     void testParseNoFileTypes();
0035     void testParseSingleFileTypeNoCheckers();
0036     void testParseSingleFileTypeSingleChecker();
0037     void testParseSingleFileTypeSeveralCheckers();
0038     void testParseSingleFileTypeSingleExtraChecker();
0039     void testParseSingleFileTypeSeveralExtraCheckers();
0040     void testParseSingleFileTypeSeveralNormalAndExtraCheckers();
0041     void testParseSeveralFileTypes();
0042 
0043     void testParseSingleCheckerExplanationEndingWithNewLine();
0044 
0045     void testParseSingleCheckerNoDescription();
0046     void testParseSingleCheckerNoExplanation();
0047 
0048     void testParseWithDataInSeveralChunks();
0049 
0050 private:
0051 
0052     void assertChecker(int index, const QString& name, const QString& description,
0053                        const QString& explanation, const QString& fileType,
0054                        bool extra) const;
0055 
0056     CheckerListParser* m_checkerListParser;
0057     QList<const Checker*>* m_checkerList;
0058 
0059 };
0060 
0061 #define KRAZY2_HEADER_XML \
0062     "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"\
0063     "<tool name=\"krazy2\" version=\"2.93\">\n"\
0064         "<file-types>\n"
0065 
0066 #define KRAZY2_FOOTER_XML \
0067         "</file-types>\n"\
0068     "</tool-result>\n"
0069 
0070 #define KRAZY2_SEVERAL_CHECKERS_XML \
0071     "<plugin name=\"checker1Name\" short-desc=\"Checker1 description\" version=\"0.4\">\n" \
0072         "<explanation>Checker1 explanation</explanation>\n" \
0073     "</plugin>\n" \
0074     "<plugin name=\"checker2Name\" short-desc=\"Checker2 description\" version=\"0.8\">\n" \
0075         "<explanation>Checker2 explanation</explanation>\n" \
0076     "</plugin>\n" \
0077     "<plugin name=\"checker3Name\" short-desc=\"Checker3 description\" version=\"1.5\">\n" \
0078         "<explanation>Checker3 explanation</explanation>\n" \
0079     "</plugin>\n"
0080 
0081 #define KRAZY2_SEVERAL_EXTRA_CHECKERS_XML \
0082     "<extra>\n" \
0083         "<plugin name=\"extraChecker1Name\" short-desc=\"Extra checker1 description\" version=\"0.4\">\n" \
0084             "<explanation>Extra checker1 explanation</explanation>\n" \
0085         "</plugin>\n" \
0086         "<plugin name=\"extraChecker2Name\" short-desc=\"Extra checker2 description\" version=\"0.8\">\n" \
0087             "<explanation>Extra checker2 explanation</explanation>\n" \
0088         "</plugin>\n" \
0089         "<plugin name=\"extraChecker3Name\" short-desc=\"Extra checker3 description\" version=\"1.5\">\n" \
0090             "<explanation>Extra checker3 explanation</explanation>\n" \
0091         "</plugin>\n" \
0092     "</extra>"
0093 
0094 void CheckerListParserTest::init() {
0095     m_checkerListParser = new CheckerListParser();
0096     m_checkerList = new QList<const Checker*>();
0097     m_checkerListParser->setCheckerList(m_checkerList);
0098 }
0099 
0100 void CheckerListParserTest::cleanup() {
0101     qDeleteAll(*m_checkerList);
0102     delete m_checkerList;
0103     delete m_checkerListParser;
0104 }
0105 
0106 //I don't think that this could happen, but just in case
0107 void CheckerListParserTest::testParseNoFileTypes() {
0108     QString data =
0109         KRAZY2_HEADER_XML
0110         KRAZY2_FOOTER_XML;
0111 
0112     m_checkerListParser->parse(data);
0113 
0114     QCOMPARE(m_checkerList->size(), 0);
0115 }
0116 
0117 //I don't think that this could happen, but just in case
0118 void CheckerListParserTest::testParseSingleFileTypeNoCheckers() {
0119     QString data =
0120         KRAZY2_HEADER_XML
0121         "<file-type value=\"fileType\">\n"
0122         "</file-type>\n"
0123         KRAZY2_FOOTER_XML;
0124 
0125     m_checkerListParser->parse(data);
0126 
0127     QCOMPARE(m_checkerList->size(), 0);
0128 }
0129 
0130 void CheckerListParserTest::testParseSingleFileTypeSingleChecker() {
0131     QString data =
0132         KRAZY2_HEADER_XML
0133         "<file-type value=\"fileType\">\n"
0134             "<plugin name=\"checkerName\" short-desc=\"Checker description\" version=\"0.4\">\n"
0135                 "<explanation>Checker explanation</explanation>\n"
0136             "</plugin>\n"
0137         "</file-type>\n"
0138         KRAZY2_FOOTER_XML;
0139 
0140     m_checkerListParser->parse(data);
0141 
0142     QCOMPARE(m_checkerList->size(), 1);
0143     assertChecker(0, "checkerName", "Checker description", "Checker explanation", "fileType", false);
0144 }
0145 
0146 void CheckerListParserTest::testParseSingleFileTypeSeveralCheckers() {
0147     QString data =
0148         KRAZY2_HEADER_XML
0149         "<file-type value=\"fileType\">\n"
0150             KRAZY2_SEVERAL_CHECKERS_XML
0151         "</file-type>\n"
0152         KRAZY2_FOOTER_XML;
0153 
0154     m_checkerListParser->parse(data);
0155 
0156     QCOMPARE(m_checkerList->size(), 3);
0157     assertChecker(0, "checker1Name", "Checker1 description", "Checker1 explanation", "fileType", false);
0158     assertChecker(1, "checker2Name", "Checker2 description", "Checker2 explanation", "fileType", false);
0159     assertChecker(2, "checker3Name", "Checker3 description", "Checker3 explanation", "fileType", false);
0160 }
0161 
0162 void CheckerListParserTest::testParseSingleFileTypeSingleExtraChecker() {
0163     QString data =
0164         KRAZY2_HEADER_XML
0165         "<file-type value=\"fileType\">\n"
0166             "<extra>\n"
0167                 "<plugin name=\"extraCheckerName\" short-desc=\"Extra checker description\" version=\"0.4\">\n"
0168                     "<explanation>Extra checker explanation</explanation>\n"
0169                 "</plugin>\n"
0170             "</extra>\n"
0171         "</file-type>\n"
0172         KRAZY2_FOOTER_XML;
0173 
0174     m_checkerListParser->parse(data);
0175 
0176     QCOMPARE(m_checkerList->size(), 1);
0177     assertChecker(0, "extraCheckerName", "Extra checker description", "Extra checker explanation", "fileType", true);
0178 }
0179 
0180 void CheckerListParserTest::testParseSingleFileTypeSeveralExtraCheckers() {
0181     QString data =
0182         KRAZY2_HEADER_XML
0183         "<file-type value=\"fileType\">\n"
0184             KRAZY2_SEVERAL_EXTRA_CHECKERS_XML
0185         "</file-type>\n"
0186         KRAZY2_FOOTER_XML;
0187 
0188     m_checkerListParser->parse(data);
0189 
0190     QCOMPARE(m_checkerList->size(), 3);
0191     assertChecker(0, "extraChecker1Name", "Extra checker1 description", "Extra checker1 explanation", "fileType", true);
0192     assertChecker(1, "extraChecker2Name", "Extra checker2 description", "Extra checker2 explanation", "fileType", true);
0193     assertChecker(2, "extraChecker3Name", "Extra checker3 description", "Extra checker3 explanation", "fileType", true);
0194 }
0195 
0196 void CheckerListParserTest::testParseSingleFileTypeSeveralNormalAndExtraCheckers() {
0197     QString data =
0198         KRAZY2_HEADER_XML
0199         "<file-type value=\"fileType\">\n"
0200             KRAZY2_SEVERAL_CHECKERS_XML
0201             KRAZY2_SEVERAL_EXTRA_CHECKERS_XML
0202         "</file-type>\n"
0203         KRAZY2_FOOTER_XML;
0204 
0205     m_checkerListParser->parse(data);
0206 
0207     QCOMPARE(m_checkerList->size(), 6);
0208     assertChecker(0, "checker1Name", "Checker1 description", "Checker1 explanation", "fileType", false);
0209     assertChecker(1, "checker2Name", "Checker2 description", "Checker2 explanation", "fileType", false);
0210     assertChecker(2, "checker3Name", "Checker3 description", "Checker3 explanation", "fileType", false);
0211     assertChecker(3, "extraChecker1Name", "Extra checker1 description", "Extra checker1 explanation", "fileType", true);
0212     assertChecker(4, "extraChecker2Name", "Extra checker2 description", "Extra checker2 explanation", "fileType", true);
0213     assertChecker(5, "extraChecker3Name", "Extra checker3 description", "Extra checker3 explanation", "fileType", true);
0214 }
0215 
0216 void CheckerListParserTest::testParseSeveralFileTypes() {
0217     QString data =
0218         KRAZY2_HEADER_XML
0219         "<file-type value=\"fileType1\">\n"
0220             "<plugin name=\"checkerName\" short-desc=\"Checker description\" version=\"1.6\">\n"
0221                 "<explanation>Checker explanation</explanation>\n"
0222             "</plugin>\n"
0223             KRAZY2_SEVERAL_EXTRA_CHECKERS_XML
0224         "</file-type>\n"
0225         "<file-type value=\"fileType2\">\n"
0226             KRAZY2_SEVERAL_CHECKERS_XML
0227             KRAZY2_SEVERAL_EXTRA_CHECKERS_XML
0228         "</file-type>\n"
0229         "<file-type value=\"fileType3\">\n"
0230             KRAZY2_SEVERAL_CHECKERS_XML
0231             "<extra>\n"
0232                 "<plugin name=\"extraCheckerName\" short-desc=\"Extra checker description\" version=\"2.3\">\n"
0233                     "<explanation>Extra checker explanation</explanation>\n"
0234                 "</plugin>\n"
0235             "</extra>\n"
0236         "</file-type>\n"
0237         KRAZY2_FOOTER_XML;
0238 
0239     m_checkerListParser->parse(data);
0240 
0241     QCOMPARE(m_checkerList->size(), 14);
0242     assertChecker(0, "checkerName", "Checker description", "Checker explanation", "fileType1", false);
0243     assertChecker(1, "extraChecker1Name", "Extra checker1 description", "Extra checker1 explanation", "fileType1", true);
0244     assertChecker(2, "extraChecker2Name", "Extra checker2 description", "Extra checker2 explanation", "fileType1", true);
0245     assertChecker(3, "extraChecker3Name", "Extra checker3 description", "Extra checker3 explanation", "fileType1", true);
0246     assertChecker(4, "checker1Name", "Checker1 description", "Checker1 explanation", "fileType2", false);
0247     assertChecker(5, "checker2Name", "Checker2 description", "Checker2 explanation", "fileType2", false);
0248     assertChecker(6, "checker3Name", "Checker3 description", "Checker3 explanation", "fileType2", false);
0249     assertChecker(7, "extraChecker1Name", "Extra checker1 description", "Extra checker1 explanation", "fileType2", true);
0250     assertChecker(8, "extraChecker2Name", "Extra checker2 description", "Extra checker2 explanation", "fileType2", true);
0251     assertChecker(9, "extraChecker3Name", "Extra checker3 description", "Extra checker3 explanation", "fileType2", true);
0252     assertChecker(10, "checker1Name", "Checker1 description", "Checker1 explanation", "fileType3", false);
0253     assertChecker(11, "checker2Name", "Checker2 description", "Checker2 explanation", "fileType3", false);
0254     assertChecker(12, "checker3Name", "Checker3 description", "Checker3 explanation", "fileType3", false);
0255     assertChecker(13, "extraCheckerName", "Extra checker description", "Extra checker explanation", "fileType3", true);
0256 }
0257 
0258 void CheckerListParserTest::testParseSingleCheckerExplanationEndingWithNewLine() {
0259     QString data =
0260         KRAZY2_HEADER_XML
0261         "<file-type value=\"fileType\">\n"
0262             "<plugin name=\"checkerName\" short-desc=\"Checker description\" version=\"0.4\">\n"
0263                 "<explanation>Checker explanation\n</explanation>\n"
0264             "</plugin>\n"
0265         "</file-type>\n"
0266         KRAZY2_FOOTER_XML;
0267 
0268     m_checkerListParser->parse(data);
0269 
0270     QCOMPARE(m_checkerList->size(), 1);
0271     assertChecker(0, "checkerName", "Checker description", "Checker explanation", "fileType", false);
0272 }
0273 
0274 void CheckerListParserTest::testParseSingleCheckerNoDescription() {
0275     QString data =
0276         KRAZY2_HEADER_XML
0277         "<file-type value=\"fileType\">\n"
0278             "<plugin name=\"checkerName\" short-desc=\"(no description available)\" version=\"0.4\">\n"
0279                 "<explanation>Checker explanation</explanation>\n"
0280             "</plugin>\n"
0281         "</file-type>\n"
0282         KRAZY2_FOOTER_XML;
0283 
0284     m_checkerListParser->parse(data);
0285 
0286     QCOMPARE(m_checkerList->size(), 1);
0287     assertChecker(0, "checkerName", "", "Checker explanation", "fileType", false);
0288 }
0289 
0290 void CheckerListParserTest::testParseSingleCheckerNoExplanation() {
0291     QString data =
0292         KRAZY2_HEADER_XML
0293         "<file-type value=\"fileType\">\n"
0294             "<plugin name=\"checkerName\" short-desc=\"Checker description\" version=\"0.4\">\n"
0295                 "<explanation>(no explanation available)</explanation>\n"
0296             "</plugin>\n"
0297         "</file-type>\n"
0298         KRAZY2_FOOTER_XML;
0299 
0300     m_checkerListParser->parse(data);
0301 
0302     QCOMPARE(m_checkerList->size(), 1);
0303     assertChecker(0, "checkerName", "Checker description", "", "fileType", false);
0304 }
0305 
0306 void CheckerListParserTest::testParseWithDataInSeveralChunks() {
0307     QString data =
0308         KRAZY2_HEADER_XML
0309         "<file-type value=\"fileType1\">\n"
0310             "<plugin name=\"checkerName\" short-desc=\"Checker description\" version=\"1.6\">\n"
0311                 "<explanation>Checker explanation</explanation>\n"
0312             "</plugin>\n"
0313             KRAZY2_SEVERAL_EXTRA_CHECKERS_XML
0314         "</file-type>\n"
0315         "<file-type value=\"fileType2\">\n"
0316             KRAZY2_SEVERAL_CHECKERS_XML
0317             KRAZY2_SEVERAL_EXTRA_CHECKERS_XML
0318         "</file-type>\n"
0319         "<file-type value=\"fileType3\">\n"
0320             KRAZY2_SEVERAL_CHECKERS_XML
0321             "<extra>\n"
0322                 "<plugin name=\"extraCheckerName\" short-desc=\"Extra checker description\" version=\"2.3\">\n"
0323                     "<explanation>Extra checker explanation</explanation>\n"
0324                 "</plugin>\n"
0325             "</extra>\n"
0326         "</file-type>\n"
0327         KRAZY2_FOOTER_XML;
0328 
0329     srand(time(nullptr));
0330 
0331     for (int i=0; i<1000; i++) {
0332         qDeleteAll(*m_checkerList);
0333         delete m_checkerList;
0334         delete m_checkerListParser;
0335 
0336         m_checkerListParser = new CheckerListParser();
0337         m_checkerList = new QList<const Checker*>();
0338         m_checkerListParser->setCheckerList(m_checkerList);
0339 
0340         QString remainingData = data;
0341         while (remainingData.size() > 0) {
0342             const float randomValue = rand()/float(RAND_MAX);
0343             int numberOfCharacters = randomValue * remainingData.size();
0344 
0345             // A little help to random number generator to speed up the test, as
0346             // chances of getting a RAND_MAX are scarce
0347             if (remainingData.size() == 1) {
0348                 numberOfCharacters = 1;
0349             }
0350 
0351             m_checkerListParser->parse(remainingData.left(numberOfCharacters));
0352             remainingData.remove(0, numberOfCharacters);
0353         }
0354 
0355         QCOMPARE(m_checkerList->size(), 14);
0356         assertChecker(0, "checkerName", "Checker description", "Checker explanation", "fileType1", false);
0357         assertChecker(1, "extraChecker1Name", "Extra checker1 description", "Extra checker1 explanation", "fileType1", true);
0358         assertChecker(2, "extraChecker2Name", "Extra checker2 description", "Extra checker2 explanation", "fileType1", true);
0359         assertChecker(3, "extraChecker3Name", "Extra checker3 description", "Extra checker3 explanation", "fileType1", true);
0360         assertChecker(4, "checker1Name", "Checker1 description", "Checker1 explanation", "fileType2", false);
0361         assertChecker(5, "checker2Name", "Checker2 description", "Checker2 explanation", "fileType2", false);
0362         assertChecker(6, "checker3Name", "Checker3 description", "Checker3 explanation", "fileType2", false);
0363         assertChecker(7, "extraChecker1Name", "Extra checker1 description", "Extra checker1 explanation", "fileType2", true);
0364         assertChecker(8, "extraChecker2Name", "Extra checker2 description", "Extra checker2 explanation", "fileType2", true);
0365         assertChecker(9, "extraChecker3Name", "Extra checker3 description", "Extra checker3 explanation", "fileType2", true);
0366         assertChecker(10, "checker1Name", "Checker1 description", "Checker1 explanation", "fileType3", false);
0367         assertChecker(11, "checker2Name", "Checker2 description", "Checker2 explanation", "fileType3", false);
0368         assertChecker(12, "checker3Name", "Checker3 description", "Checker3 explanation", "fileType3", false);
0369         assertChecker(13, "extraCheckerName", "Extra checker description", "Extra checker explanation", "fileType3", true);
0370     }
0371 }
0372 
0373 ////////////////////////////////// Helpers /////////////////////////////////////
0374 
0375 void CheckerListParserTest::assertChecker(int index, const QString& name, const QString& description,
0376                                           const QString& explanation, const QString& fileType,
0377                                           bool extra) const {
0378     const Checker* checker = m_checkerList->at(index);
0379     QVERIFY(checker);
0380     QCOMPARE(checker->name(), name);
0381     QCOMPARE(checker->description(), description);
0382     QCOMPARE(checker->explanation(), explanation);
0383     QCOMPARE(checker->fileType(), fileType);
0384     QCOMPARE(checker->isExtra(), extra);
0385 }
0386 
0387 QTEST_GUILESS_MAIN(CheckerListParserTest)
0388 
0389 #include "checkerlistparsertest.moc"