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"