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

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_clangtidyjob.h"
0008 
0009 // SUT
0010 #include "job.h"
0011 // KDevPlatform
0012 #include <language/editor/documentrange.h>
0013 #include <tests/autotestshell.h>
0014 #include <tests/testcore.h>
0015 // Qt
0016 #include <QTest>
0017 #include <QSignalSpy>
0018 
0019 
0020 using namespace KDevelop;
0021 using namespace ClangTidy;
0022 
0023 class JobTester : public Job
0024 {
0025     Q_OBJECT
0026 
0027 public:
0028     JobTester(Job::Parameters params)
0029         : Job(params)
0030     {
0031     }
0032 
0033     using Job::processStdoutLines;
0034     using Job::processStderrLines;
0035     using Job::childProcessExited;
0036 
0037     QString standardOutput() const { return m_standardOutput.join('\n'); }
0038 };
0039 
0040 void TestClangTidyJob::initTestCase()
0041 {
0042     AutoTestShell::init({ "kdevclangtidy" });
0043     TestCore::initialize(Core::NoUi);
0044 }
0045 
0046 void TestClangTidyJob::cleanupTestCase()
0047 {
0048     TestCore::shutdown();
0049 }
0050 
0051 void TestClangTidyJob::testJob()
0052 {
0053     QFile output_example_file(QFINDTESTDATA("data/output_example"));
0054     QVERIFY(output_example_file.open(QIODevice::ReadOnly));
0055     QTextStream ios(&output_example_file);
0056     QStringList stdoutOutput;
0057     QString line;
0058     while (ios.readLineInto(&line)) {
0059         stdoutOutput << line;
0060     }
0061     QVERIFY(!stdoutOutput.isEmpty());
0062 
0063     Job::Parameters jobParams;
0064     JobTester jobTester(jobParams);
0065 
0066     qRegisterMetaType<QVector<KDevelop::IProblem::Ptr>>();
0067     QSignalSpy problemsSpy(&jobTester, &JobTester::problemsDetected);
0068 
0069     jobTester.processStdoutLines(stdoutOutput);
0070     QCOMPARE(jobTester.standardOutput(), stdoutOutput.join('\n'));
0071 
0072     jobTester.childProcessExited(0, QProcess::NormalExit);
0073 
0074     QCOMPARE(problemsSpy.count(), 1);
0075     const auto problems = qvariant_cast<QVector<KDevelop::IProblem::Ptr>>(problemsSpy.at(0).at(0));
0076 
0077     QVERIFY(problems[0]->finalLocation().document.str().contains(QStringLiteral("/kdev-clang-tidy/src/plugin.cpp")));
0078     QVERIFY(
0079         problems[0]->explanation().startsWith(QStringLiteral("[cppcoreguidelines-pro-bounds-array-to-pointer-decay]")));
0080     QVERIFY(problems[1]->finalLocation().document.str().contains(QStringLiteral("/kdev-clang-tidy/src/plugin.cpp")));
0081 
0082     QVERIFY(
0083         problems[1]->explanation().startsWith(QStringLiteral("[cppcoreguidelines-pro-bounds-array-to-pointer-decay]")));
0084     QVERIFY(problems[2]->finalLocation().document.str().contains(QStringLiteral("/kdev-clang-tidy/src/plugin.cpp")));
0085 
0086     QVERIFY(
0087         problems[2]->explanation().startsWith(QStringLiteral("[cppcoreguidelines-pro-bounds-array-to-pointer-decay]")));
0088 }
0089 
0090 QTEST_GUILESS_MAIN(TestClangTidyJob)
0091 
0092 #include "test_clangtidyjob.moc"
0093 #include "moc_test_clangtidyjob.cpp"