forked from qt-creator/qt-creator
ClangTools: Clean up plugin tests
We can provide the run settings explicitly instead of writing to the settings. Change-Id: Ibb9ef0280c14315ff7ba72be75dfd04c50d84484 Reviewed-by: Cristian Adam <cristian.adam@qt.io> Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
@@ -239,8 +239,9 @@ static FileInfos sortedFileInfos(const QVector<CppTools::ProjectPart::Ptr> &proj
|
|||||||
return fileInfos;
|
return fileInfos;
|
||||||
}
|
}
|
||||||
|
|
||||||
static RunSettings runSettings(Project *project)
|
static RunSettings runSettings()
|
||||||
{
|
{
|
||||||
|
Project *project = SessionManager::startupProject();
|
||||||
auto *projectSettings = ClangToolsProjectSettingsManager::getSettings(project);
|
auto *projectSettings = ClangToolsProjectSettingsManager::getSettings(project);
|
||||||
if (projectSettings->useGlobalSettings())
|
if (projectSettings->useGlobalSettings())
|
||||||
return ClangToolsSettings::instance()->runSettings();
|
return ClangToolsSettings::instance()->runSettings();
|
||||||
@@ -399,7 +400,7 @@ ClangTool::ClangTool()
|
|||||||
menu->addAction(ActionManager::registerAction(action, "ClangTidyClazy.Action"),
|
menu->addAction(ActionManager::registerAction(action, "ClangTidyClazy.Action"),
|
||||||
Debugger::Constants::G_ANALYZER_TOOLS);
|
Debugger::Constants::G_ANALYZER_TOOLS);
|
||||||
QObject::connect(action, &QAction::triggered, this, [this]() {
|
QObject::connect(action, &QAction::triggered, this, [this]() {
|
||||||
startTool(ClangTool::FileSelection::AskUser);
|
startTool(FileSelection::AskUser);
|
||||||
});
|
});
|
||||||
QObject::connect(m_startAction, &QAction::triggered, action, &QAction::triggered);
|
QObject::connect(m_startAction, &QAction::triggered, action, &QAction::triggered);
|
||||||
QObject::connect(m_startAction, &QAction::changed, action, [action, this] {
|
QObject::connect(m_startAction, &QAction::changed, action, [action, this] {
|
||||||
@@ -407,7 +408,7 @@ ClangTool::ClangTool()
|
|||||||
});
|
});
|
||||||
|
|
||||||
QObject::connect(m_startOnCurrentFileAction, &QAction::triggered, this, [this] {
|
QObject::connect(m_startOnCurrentFileAction, &QAction::triggered, this, [this] {
|
||||||
startTool(ClangTool::FileSelection::CurrentFile);
|
startTool(FileSelection::CurrentFile);
|
||||||
});
|
});
|
||||||
|
|
||||||
m_perspective.addToolBarAction(m_startAction);
|
m_perspective.addToolBarAction(m_startAction);
|
||||||
@@ -438,6 +439,11 @@ void ClangTool::selectPerspective()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ClangTool::startTool(ClangTool::FileSelection fileSelection)
|
void ClangTool::startTool(ClangTool::FileSelection fileSelection)
|
||||||
|
{
|
||||||
|
startTool(runSettings(), fileSelection);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClangTool::startTool(const RunSettings &runSettings, ClangTool::FileSelection fileSelection)
|
||||||
{
|
{
|
||||||
Project *project = SessionManager::startupProject();
|
Project *project = SessionManager::startupProject();
|
||||||
QTC_ASSERT(project, return);
|
QTC_ASSERT(project, return);
|
||||||
@@ -453,10 +459,7 @@ void ClangTool::startTool(ClangTool::FileSelection fileSelection)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
const bool preventBuild = fileSelection == FileSelection::CurrentFile;
|
const bool preventBuild = fileSelection == FileSelection::CurrentFile;
|
||||||
auto clangTool = new ClangToolRunWorker(runControl,
|
auto clangTool = new ClangToolRunWorker(runControl, runSettings, fileInfos, preventBuild);
|
||||||
runSettings(project),
|
|
||||||
fileInfos,
|
|
||||||
preventBuild);
|
|
||||||
|
|
||||||
m_stopAction->disconnect();
|
m_stopAction->disconnect();
|
||||||
connect(m_stopAction, &QAction::triggered, runControl, [runControl] {
|
connect(m_stopAction, &QAction::triggered, runControl, [runControl] {
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ namespace Internal {
|
|||||||
class ClangToolsDiagnosticModel;
|
class ClangToolsDiagnosticModel;
|
||||||
class Diagnostic;
|
class Diagnostic;
|
||||||
class DiagnosticFilterModel;
|
class DiagnosticFilterModel;
|
||||||
|
class RunSettings;
|
||||||
|
|
||||||
const char ClangTidyClazyPerspectiveId[] = "ClangTidyClazy.Perspective";
|
const char ClangTidyClazyPerspectiveId[] = "ClangTidyClazy.Perspective";
|
||||||
|
|
||||||
@@ -73,6 +74,7 @@ public:
|
|||||||
AskUser,
|
AskUser,
|
||||||
};
|
};
|
||||||
void startTool(FileSelection fileSelection);
|
void startTool(FileSelection fileSelection);
|
||||||
|
void startTool(const RunSettings &runSettings, FileSelection fileSelection);
|
||||||
|
|
||||||
Diagnostics read(OutputFileFormat outputFileFormat,
|
Diagnostics read(OutputFileFormat outputFileFormat,
|
||||||
const QString &logFilePath,
|
const QString &logFilePath,
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include "clangtool.h"
|
#include "clangtool.h"
|
||||||
#include "clangtoolsdiagnostic.h"
|
#include "clangtoolsdiagnostic.h"
|
||||||
|
#include "clangtoolssettings.h"
|
||||||
#include "clangtoolsutils.h"
|
#include "clangtoolsutils.h"
|
||||||
|
|
||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
@@ -121,7 +122,8 @@ void PreconfiguredSessionTests::testPreconfiguredSession()
|
|||||||
|
|
||||||
QVERIFY(switchToProjectAndTarget(project, target));
|
QVERIFY(switchToProjectAndTarget(project, target));
|
||||||
|
|
||||||
ClangTool::instance()->startTool(ClangTool::FileSelection::AllFiles);
|
ClangTool::instance()->startTool(ClangToolsSettings::instance()->runSettings(),
|
||||||
|
ClangTool::FileSelection::AllFiles);
|
||||||
QSignalSpy waitUntilAnalyzerFinished(ClangTool::instance(), SIGNAL(finished(bool)));
|
QSignalSpy waitUntilAnalyzerFinished(ClangTool::instance(), SIGNAL(finished(bool)));
|
||||||
QVERIFY(waitUntilAnalyzerFinished.wait(30000));
|
QVERIFY(waitUntilAnalyzerFinished.wait(30000));
|
||||||
const QList<QVariant> arguments = waitUntilAnalyzerFinished.takeFirst();
|
const QList<QVariant> arguments = waitUntilAnalyzerFinished.takeFirst();
|
||||||
|
|||||||
@@ -48,6 +48,7 @@
|
|||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QtTest>
|
#include <QtTest>
|
||||||
|
|
||||||
|
using namespace CppTools;
|
||||||
using namespace ProjectExplorer;
|
using namespace ProjectExplorer;
|
||||||
using namespace Utils;
|
using namespace Utils;
|
||||||
|
|
||||||
@@ -69,7 +70,7 @@ void ClangToolsUnitTests::initTestCase()
|
|||||||
if (Core::ICore::clangExecutable(CLANG_BINDIR).isEmpty())
|
if (Core::ICore::clangExecutable(CLANG_BINDIR).isEmpty())
|
||||||
QSKIP("No clang suitable for analyzing found");
|
QSKIP("No clang suitable for analyzing found");
|
||||||
|
|
||||||
m_tmpDir = new CppTools::Tests::TemporaryCopiedDir(QLatin1String(":/unit-tests"));
|
m_tmpDir = new Tests::TemporaryCopiedDir(QLatin1String(":/unit-tests"));
|
||||||
QVERIFY(m_tmpDir->isValid());
|
QVERIFY(m_tmpDir->isValid());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,15 +79,15 @@ void ClangToolsUnitTests::cleanupTestCase()
|
|||||||
delete m_tmpDir;
|
delete m_tmpDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
static CppTools::ClangDiagnosticConfig configFor(const QString &tidyChecks,
|
static ClangDiagnosticConfig configFor(const QString &tidyChecks,
|
||||||
const QString &clazyChecks)
|
const QString &clazyChecks)
|
||||||
{
|
{
|
||||||
CppTools::ClangDiagnosticConfig config;
|
ClangDiagnosticConfig config;
|
||||||
config.setId("Test.MyTestConfig");
|
config.setId("Test.MyTestConfig");
|
||||||
config.setDisplayName("Test");
|
config.setDisplayName("Test");
|
||||||
config.setIsReadOnly(true);
|
config.setIsReadOnly(true);
|
||||||
config.setClangOptions(QStringList{QStringLiteral("-Wno-everything")});
|
config.setClangOptions(QStringList{QStringLiteral("-Wno-everything")});
|
||||||
config.setClangTidyMode(CppTools::ClangDiagnosticConfig::TidyMode::ChecksPrefixList);
|
config.setClangTidyMode(ClangDiagnosticConfig::TidyMode::ChecksPrefixList);
|
||||||
const QString theTidyChecks = tidyChecks.isEmpty() ? tidyChecks : "-*," + tidyChecks;
|
const QString theTidyChecks = tidyChecks.isEmpty() ? tidyChecks : "-*," + tidyChecks;
|
||||||
config.setClangTidyChecks(theTidyChecks);
|
config.setClangTidyChecks(theTidyChecks);
|
||||||
config.setClazyChecks(clazyChecks);
|
config.setClazyChecks(clazyChecks);
|
||||||
@@ -97,46 +98,37 @@ void ClangToolsUnitTests::testProject()
|
|||||||
{
|
{
|
||||||
QFETCH(QString, projectFilePath);
|
QFETCH(QString, projectFilePath);
|
||||||
QFETCH(int, expectedDiagCount);
|
QFETCH(int, expectedDiagCount);
|
||||||
QFETCH(CppTools::ClangDiagnosticConfig, diagnosticConfig);
|
QFETCH(ClangDiagnosticConfig, diagnosticConfig);
|
||||||
if (projectFilePath.contains("mingw")) {
|
if (projectFilePath.contains("mingw")) {
|
||||||
const ToolChain * const toolchain
|
const ToolChain *const toolchain
|
||||||
= ToolChainKitAspect::toolChain(KitManager::kits().constFirst(),
|
= ToolChainKitAspect::toolChain(KitManager::kits().constFirst(),
|
||||||
Constants::CXX_LANGUAGE_ID);
|
Constants::CXX_LANGUAGE_ID);
|
||||||
if (toolchain->typeId() != ProjectExplorer::Constants::MINGW_TOOLCHAIN_TYPEID)
|
if (toolchain->typeId() != ProjectExplorer::Constants::MINGW_TOOLCHAIN_TYPEID)
|
||||||
QSKIP("This test is mingw specific, does not run for other toolchains");
|
QSKIP("This test is mingw specific, does not run for other toolchains");
|
||||||
}
|
}
|
||||||
|
|
||||||
CppTools::Tests::ProjectOpenerAndCloser projectManager;
|
Tests::ProjectOpenerAndCloser projectManager;
|
||||||
const CppTools::ProjectInfo projectInfo = projectManager.open(projectFilePath, true);
|
const ProjectInfo projectInfo = projectManager.open(projectFilePath, true);
|
||||||
QVERIFY(projectInfo.isValid());
|
QVERIFY(projectInfo.isValid());
|
||||||
ClangTool *tool = ClangTool::instance();
|
ClangTool *tool = ClangTool::instance();
|
||||||
|
|
||||||
// Change configs
|
// Change configs
|
||||||
QSharedPointer<CppTools::CppCodeModelSettings> cppToolsSettings = CppTools::codeModelSettings();
|
QSharedPointer<CppCodeModelSettings> cppToolsSettings = codeModelSettings();
|
||||||
ClangToolsSettings *clangToolsSettings = ClangToolsSettings::instance();
|
ClangToolsSettings *clangToolsSettings = ClangToolsSettings::instance();
|
||||||
const CppTools::ClangDiagnosticConfigs originalConfigs = cppToolsSettings
|
const ClangDiagnosticConfigs originalConfigs = cppToolsSettings->clangCustomDiagnosticConfigs();
|
||||||
->clangCustomDiagnosticConfigs();
|
|
||||||
const Core::Id originalId = clangToolsSettings->runSettings().diagnosticConfigId();
|
|
||||||
|
|
||||||
CppTools::ClangDiagnosticConfigs modifiedConfigs = originalConfigs;
|
ClangDiagnosticConfigs modifiedConfigs = originalConfigs;
|
||||||
modifiedConfigs.push_back(diagnosticConfig);
|
modifiedConfigs.push_back(diagnosticConfig);
|
||||||
|
|
||||||
ExecuteOnDestruction executeOnDestruction([=]() {
|
ExecuteOnDestruction restoreCustomConfigs([=]() {
|
||||||
// Restore configs
|
|
||||||
cppToolsSettings->setClangCustomDiagnosticConfigs(originalConfigs);
|
cppToolsSettings->setClangCustomDiagnosticConfigs(originalConfigs);
|
||||||
RunSettings runSettings = clangToolsSettings->runSettings();
|
|
||||||
runSettings.setDiagnosticConfigId(originalId);
|
|
||||||
clangToolsSettings->setRunSettings(runSettings);
|
|
||||||
clangToolsSettings->writeSettings();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
cppToolsSettings->setClangCustomDiagnosticConfigs(modifiedConfigs);
|
cppToolsSettings->setClangCustomDiagnosticConfigs(modifiedConfigs);
|
||||||
RunSettings runSettings = clangToolsSettings->runSettings();
|
RunSettings runSettings = clangToolsSettings->runSettings();
|
||||||
runSettings.setDiagnosticConfigId(diagnosticConfig.id());
|
runSettings.setDiagnosticConfigId(diagnosticConfig.id());
|
||||||
clangToolsSettings->setRunSettings(runSettings);
|
|
||||||
clangToolsSettings->writeSettings();
|
|
||||||
|
|
||||||
tool->startTool(ClangTool::FileSelection::AllFiles);
|
tool->startTool(runSettings, ClangTool::FileSelection::AllFiles);
|
||||||
QSignalSpy waiter(tool, SIGNAL(finished(bool)));
|
QSignalSpy waiter(tool, SIGNAL(finished(bool)));
|
||||||
QVERIFY(waiter.wait(30000));
|
QVERIFY(waiter.wait(30000));
|
||||||
|
|
||||||
@@ -149,10 +141,10 @@ void ClangToolsUnitTests::testProject_data()
|
|||||||
{
|
{
|
||||||
QTest::addColumn<QString>("projectFilePath");
|
QTest::addColumn<QString>("projectFilePath");
|
||||||
QTest::addColumn<int>("expectedDiagCount");
|
QTest::addColumn<int>("expectedDiagCount");
|
||||||
QTest::addColumn<CppTools::ClangDiagnosticConfig>("diagnosticConfig");
|
QTest::addColumn<ClangDiagnosticConfig>("diagnosticConfig");
|
||||||
|
|
||||||
// Test simple C++ project.
|
// Test simple C++ project.
|
||||||
CppTools::ClangDiagnosticConfig config = configFor("modernize-use-nullptr", QString());
|
ClangDiagnosticConfig config = configFor("modernize-use-nullptr", QString());
|
||||||
addTestRow("simple/simple.qbs", 1, config);
|
addTestRow("simple/simple.qbs", 1, config);
|
||||||
addTestRow("simple/simple.pro", 1, config);
|
addTestRow("simple/simple.pro", 1, config);
|
||||||
|
|
||||||
@@ -186,7 +178,7 @@ void ClangToolsUnitTests::testProject_data()
|
|||||||
|
|
||||||
void ClangToolsUnitTests::addTestRow(const QByteArray &relativeFilePath,
|
void ClangToolsUnitTests::addTestRow(const QByteArray &relativeFilePath,
|
||||||
int expectedDiagCount,
|
int expectedDiagCount,
|
||||||
const CppTools::ClangDiagnosticConfig &diagnosticConfig)
|
const ClangDiagnosticConfig &diagnosticConfig)
|
||||||
{
|
{
|
||||||
const QString absoluteFilePath = m_tmpDir->absolutePath(relativeFilePath);
|
const QString absoluteFilePath = m_tmpDir->absolutePath(relativeFilePath);
|
||||||
const QString fileName = QFileInfo(absoluteFilePath).fileName();
|
const QString fileName = QFileInfo(absoluteFilePath).fileName();
|
||||||
|
|||||||
Reference in New Issue
Block a user