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"