File indexing completed on 2024-05-12 04:39:23

0001 /*
0002     SPDX-FileCopyrightText: 2016 Carlos Nihelton <carlosnsoliveira@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "test_replacementparser.h"
0008 
0009 // SUT
0010 #include "parsers/replacementparser.h"
0011 // KDevPlatform
0012 #include <tests/autotestshell.h>
0013 #include <tests/testcore.h>
0014 // Qt
0015 #include <QTest>
0016 
0017 using namespace KDevelop;
0018 using namespace ClangTidy;
0019 
0020 void ReplacementsParserTester::initTestCase()
0021 {
0022     // Called before the first testfunction is executed
0023     AutoTestShell::init({ "kdevclangtidy" });
0024     TestCore::initialize(Core::NoUi);
0025 }
0026 
0027 void ReplacementsParserTester::cleanupTestCase()
0028 {
0029     // Called after the last testfunction was executed
0030     TestCore::shutdown();
0031 }
0032 
0033 void ReplacementsParserTester::doTest()
0034 {
0035     ReplacementParser parser("data/plugin.cpp.yaml", "data/plugin.cpp");
0036     parser.parse();
0037     auto v = parser.allReplacements();
0038 
0039     QVERIFY(!v.isEmpty());
0040     QCOMPARE(v.length(), static_cast<int>(parser.count()));
0041 
0042     QCOMPARE(v[0].range.document.str(), QStringLiteral("data/plugin.cpp"));
0043     QCOMPARE(v[0].offset, size_t(6263));
0044     QCOMPARE(v[0].length, size_t(1));
0045     QCOMPARE(v[0].replacementText, QString());
0046     QCOMPARE(v[0].range.start().line() + 1, 155); // as would appear in editor.
0047     QCOMPARE(v[0].range.start().column() + 1, 9); // as would appear in editor.
0048 
0049     QCOMPARE(v[1].range.document.str(), QStringLiteral("data/plugin.cpp"));
0050     QCOMPARE(v[1].offset, size_t(6267));
0051     QCOMPARE(v[1].length, size_t(0));
0052     QCOMPARE(v[1].replacementText, QString(" == nullptr"));
0053     QCOMPARE(v[1].range.start().line() + 1, 155);
0054     QCOMPARE(v[1].range.start().column() + 1, 13);
0055 
0056     QCOMPARE(v[2].range.document.str(), QStringLiteral("data/plugin.cpp"));
0057     QCOMPARE(v[2].offset, size_t(6561));
0058     QCOMPARE(v[2].length, size_t(1));
0059     QCOMPARE(v[2].replacementText, QString());
0060     QCOMPARE(v[2].range.start().line() + 1, 162);
0061     QCOMPARE(v[2].range.start().column() + 1, 9);
0062 
0063     QCOMPARE(v[3].range.document.str(), QStringLiteral("data/plugin.cpp"));
0064     QCOMPARE(v[3].offset, size_t(6569));
0065     QCOMPARE(v[3].length, size_t(0));
0066     QCOMPARE(v[3].replacementText, QStringLiteral(" == nullptr"));
0067     QCOMPARE(v[3].range.start().line() + 1, 162);
0068     QCOMPARE(v[3].range.start().column() + 1, 17);
0069 
0070     QCOMPARE(v[4].range.document.str(), QStringLiteral("data/plugin.cpp"));
0071     QCOMPARE(v[4].offset, size_t(7233));
0072     QCOMPARE(v[4].length, size_t(69));
0073     QCOMPARE(v[4].replacementText, QStringLiteral("// TODO(cnihelton): auto detect clang-tidy executable"
0074                                                   " instead of hard-coding it."));
0075     QCOMPARE(v[4].range.start().line() + 1, 181);
0076     QCOMPARE(v[4].range.start().column() + 1, 5);
0077 
0078     QCOMPARE(v[5].range.document.str(), QStringLiteral("data/plugin.cpp"));
0079     QCOMPARE(v[5].offset, size_t(8800));
0080     QCOMPARE(v[5].length, size_t(4));
0081     QCOMPARE(v[5].replacementText, QStringLiteral("auto "));
0082     QCOMPARE(v[5].range.start().line() + 1, 210);
0083     QCOMPARE(v[5].range.start().column() + 1, 9);
0084 
0085     QCOMPARE(v[6].range.document.str(), QStringLiteral("data/plugin.cpp"));
0086     QCOMPARE(v[6].offset, size_t(8945));
0087     QCOMPARE(v[6].length, size_t(4));
0088     QCOMPARE(v[6].replacementText, QStringLiteral("auto "));
0089     QCOMPARE(v[6].range.start().line() + 1, 214);
0090     QCOMPARE(v[6].range.start().column() + 1, 5);
0091 
0092     QCOMPARE(v[7].range.document.str(), QStringLiteral("data/plugin.cpp"));
0093     QCOMPARE(v[7].offset, size_t(9406));
0094     QCOMPARE(v[7].length, size_t(1));
0095     QCOMPARE(v[7].replacementText, QString());
0096     QCOMPARE(v[7].range.start().line() + 1, 238);
0097     QCOMPARE(v[7].range.start().column() + 1, 9);
0098 
0099     // Invalid stuff.
0100     // Modified the plugin.cpp.yaml file to try to cause and exception during parsing.
0101     // Added three lines from other file, which goes beyond the end of the plugin.cpp file in the last offsets.
0102     // The parser didn't throw exception event though it might have generated empty ranges for the last replacements.
0103     // And also invalidates the generated replacement.
0104     QVERIFY(!v[15].range.isValid());
0105     QCOMPARE(v[15].range.document.str(), QStringLiteral(""));
0106     QCOMPARE(v[15].offset, size_t(0));
0107     QCOMPARE(v[15].length, size_t(0));
0108     QCOMPARE(v[15].replacementText, QString());
0109     QCOMPARE(v[15].range.start().line() + 1, 0);
0110     QCOMPARE(v[15].range.start().column() + 1, 0);
0111 
0112     // testing multibyte chars in source code.
0113     ReplacementParser nihonParser("data/nihon_plugin.cpp.yaml", "data/nihon_plugin.cpp");
0114     nihonParser.parse();
0115     auto nv = nihonParser.allReplacements();
0116     QVERIFY(!nv.isEmpty());
0117     QCOMPARE(nv.length(), static_cast<int>(nihonParser.count()));
0118 
0119     QCOMPARE(nv[0].range.document.str(), QStringLiteral("data/nihon_plugin.cpp"));
0120     QCOMPARE(nv[0].offset, size_t(10165));
0121     QCOMPARE(nv[0].length, size_t(1));
0122     QCOMPARE(nv[0].replacementText, QString());
0123     QCOMPARE(nv[0].range.start().line() + 1, 288);
0124     QCOMPARE(nv[0].range.start().column() + 1, 9);
0125 
0126     QCOMPARE(nv[1].range.document.str(), QStringLiteral("data/nihon_plugin.cpp"));
0127     QCOMPARE(nv[1].offset, size_t(10169));
0128     QCOMPARE(nv[1].length, size_t(0));
0129     QCOMPARE(nv[1].replacementText, QStringLiteral(" == nullptr"));
0130     QCOMPARE(nv[1].range.start().line() + 1, 288);
0131     QCOMPARE(nv[1].range.start().column() + 1, 13);
0132 
0133     QCOMPARE(nv[2].range.document.str(), QStringLiteral("data/nihon_plugin.cpp"));
0134     QCOMPARE(nv[2].offset, size_t(10463));
0135     QCOMPARE(nv[2].length, size_t(1));
0136     QCOMPARE(nv[2].replacementText, QString());
0137     QCOMPARE(nv[2].range.start().line() + 1, 295);
0138     QCOMPARE(nv[2].range.start().column() + 1, 9);
0139 
0140     QCOMPARE(nv[3].range.document.str(), QStringLiteral("data/nihon_plugin.cpp"));
0141     QCOMPARE(nv[3].offset, size_t(10471));
0142     QCOMPARE(nv[3].length, size_t(0));
0143     QCOMPARE(nv[3].replacementText, QStringLiteral(" == nullptr"));
0144     QCOMPARE(nv[3].range.start().line() + 1, 295);
0145     QCOMPARE(nv[3].range.start().column() + 1, 17);
0146 
0147     QCOMPARE(nv[4].range.document.str(), QStringLiteral("data/nihon_plugin.cpp"));
0148     QCOMPARE(nv[4].offset, size_t(11135));
0149     QCOMPARE(nv[4].length, size_t(69));
0150     QCOMPARE(nv[4].replacementText, QStringLiteral("// TODO(cnihelton): auto detect clang-tidy executable "
0151                                                    "instead of hard-coding it."));
0152     QCOMPARE(nv[4].range.start().line() + 1, 314);
0153     QCOMPARE(nv[4].range.start().column() + 1, 5);
0154 }
0155 
0156 QTEST_GUILESS_MAIN(ReplacementsParserTester);
0157 
0158 #include "moc_test_replacementparser.cpp"