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_clangtidyparser.h"
0008 
0009 // SUT
0010 #include "parsers/clangtidyparser.h"
0011 // KDevPlatform
0012 #include <language/editor/documentrange.h>
0013 #include <shell/problem.h>
0014 #include <tests/autotestshell.h>
0015 #include <tests/testcore.h>
0016 // Qt
0017 #include <QFile>
0018 #include <QTextStream>
0019 #include <QTest>
0020 #include <QSignalSpy>
0021 
0022 using namespace KDevelop;
0023 using namespace ClangTidy;
0024 
0025 void TestClangTidyParser::initTestCase()
0026 {
0027     AutoTestShell::init();
0028     TestCore::initialize(Core::NoUi);
0029 }
0030 
0031 void TestClangTidyParser::cleanupTestCase()
0032 {
0033     TestCore::shutdown();
0034 }
0035 
0036 void TestClangTidyParser::testParser()
0037 {
0038     // prepare QStringList from file to be parsed.
0039     QFile output_example_file(QFINDTESTDATA("data/output_example"));
0040     QVERIFY(output_example_file.open(QIODevice::ReadOnly));
0041     QTextStream ios(&output_example_file);
0042     QStringList clangtidy_example_output;
0043     QString line;
0044     while (ios.readLineInto(&line)) {
0045         clangtidy_example_output << line;
0046     }
0047 
0048     QVERIFY(!clangtidy_example_output.isEmpty());
0049     ClangTidy::ClangTidyParser parser;
0050 
0051     qRegisterMetaType<QVector<KDevelop::IProblem::Ptr>>();
0052     QSignalSpy problemsSpy(&parser, &ClangTidyParser::problemsDetected);
0053 
0054     parser.addData(clangtidy_example_output);
0055 
0056     QCOMPARE(problemsSpy.count(), 1);
0057     const auto problems = qvariant_cast<QVector<KDevelop::IProblem::Ptr>>(problemsSpy.at(0).at(0));
0058     QVERIFY(!problems.empty());
0059 
0060     IProblem::Ptr p = problems[0];
0061     QCOMPARE(p->description(), QStringLiteral("do not implicitly decay an array into a pointer; consider using "
0062                                               "gsl::array_view or an explicit cast instead"));
0063     QVERIFY(p->explanation().startsWith(QStringLiteral("[cppcoreguidelines-pro-bounds-array-to-pointer-decay]")));
0064     QVERIFY(p->finalLocation().document.str().contains(QStringLiteral("/kdev-clang-tidy/src/plugin.cpp")));
0065     QCOMPARE(p->finalLocation().start().line() + 1, 80);
0066     QCOMPARE(p->finalLocation().start().column() + 1, 5);
0067     QCOMPARE(p->severity(), IProblem::Warning);
0068     QCOMPARE(p->source(), IProblem::Plugin);
0069 
0070     // test problem with 2 <location> elements
0071     p = problems[1];
0072     QCOMPARE(p->description(), QStringLiteral("do not implicitly decay an array into a pointer; consider using "
0073                                               "gsl::array_view or an explicit cast instead"));
0074     QVERIFY(p->explanation().startsWith(QStringLiteral("[cppcoreguidelines-pro-bounds-array-to-pointer-decay]")));
0075     QVERIFY(p->finalLocation().document.str().contains(QStringLiteral("/kdev-clang-tidy/src/plugin.cpp")));
0076     QCOMPARE(p->finalLocation().start().line() + 1, 145);
0077     QCOMPARE(p->finalLocation().start().column() + 1, 9);
0078     QCOMPARE(p->severity(), IProblem::Warning);
0079     QCOMPARE(p->source(), IProblem::Plugin);
0080 
0081     // test problem with '\\012' tokens in verbose message
0082     p = problems[2];
0083     QCOMPARE(p->description(), QStringLiteral("do not implicitly decay an array into a pointer; consider using "
0084                                               "gsl::array_view or an explicit cast instead"));
0085     QVERIFY(p->explanation().startsWith(QStringLiteral("[cppcoreguidelines-pro-bounds-array-to-pointer-decay]")));
0086     QVERIFY(p->finalLocation().document.str().contains(QStringLiteral("/kdev-clang-tidy/src/plugin.cpp")));
0087     QCOMPARE(p->finalLocation().start().line() + 1, 151);
0088     QCOMPARE(p->finalLocation().start().column() + 1, 9);
0089     QCOMPARE(p->severity(), IProblem::Warning);
0090     QCOMPARE(p->source(), IProblem::Plugin);
0091 }
0092 
0093 QTEST_GUILESS_MAIN(TestClangTidyParser)
0094 
0095 #include "moc_test_clangtidyparser.cpp"