CppTools: Move ProjectInfoGenerator tests into the plugin

Change-Id: I40d4b0b9751e77a5bb605349c86b37ad3935ca59
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Christian Kandeler
2021-07-14 14:44:08 +02:00
parent 13e8a9a136
commit 5ec52eef31
7 changed files with 158 additions and 184 deletions

View File

@@ -232,6 +232,15 @@ private slots:
void test_projectPartChooser_indicateFallbacktoProjectPartFromModelManager(); void test_projectPartChooser_indicateFallbacktoProjectPartFromModelManager();
void test_projectPartChooser_indicateFromDependencies(); void test_projectPartChooser_indicateFromDependencies();
void test_projectPartChooser_doNotIndicateFromDependencies(); void test_projectPartChooser_doNotIndicateFromDependencies();
void test_projectInfoGenerator_createNoProjectPartsForEmptyFileList();
void test_projectInfoGenerator_createSingleProjectPart();
void test_projectInfoGenerator_createMultipleProjectParts();
void test_projectInfoGenerator_projectPartIndicatesObjectiveCExtensionsByDefault();
void test_projectInfoGenerator_projectPartHasLatestLanguageVersionByDefault();
void test_projectInfoGenerator_useMacroInspectionReportForLanguageVersion();
void test_projectInfoGenerator_useCompilerFlagsForLanguageExtensions();
void test_projectInfoGenerator_projectFileKindsMatchProjectPartVersion();
#endif #endif
private: private:

View File

@@ -10,7 +10,6 @@ HEADERS += \
$$PWD/projectpart.h \ $$PWD/projectpart.h \
$$PWD/cppprojectfilecategorizer.h \ $$PWD/cppprojectfilecategorizer.h \
$$PWD/projectinfo.h \ $$PWD/projectinfo.h \
$$PWD/cppprojectinfogenerator.cpp \
$$PWD/headerpathfilter.h $$PWD/headerpathfilter.h
SOURCES += \ SOURCES += \
@@ -19,5 +18,4 @@ SOURCES += \
$$PWD/projectpart.cpp \ $$PWD/projectpart.cpp \
$$PWD/cppprojectfilecategorizer.cpp \ $$PWD/cppprojectfilecategorizer.cpp \
$$PWD/projectinfo.cpp \ $$PWD/projectinfo.cpp \
$$PWD/cppprojectinfogenerator.cpp \
$$PWD/headerpathfilter.cpp $$PWD/headerpathfilter.cpp

View File

@@ -23,8 +23,13 @@
** **
****************************************************************************/ ****************************************************************************/
#include "cppprojectinfogenerator.h"
#include "cppprojectpartchooser.h" #include "cppprojectpartchooser.h"
#include "cpptoolsplugin.h" #include "cpptoolsplugin.h"
#include "projectinfo.h"
#include <projectexplorer/toolchainconfigwidget.h>
#include <utils/algorithm.h>
#include <QtTest> #include <QtTest>
@@ -318,5 +323,149 @@ void CppToolsPlugin::test_projectPartChooser_doNotIndicateFromDependencies()
QVERIFY(!(t.choose().hints & ProjectPartInfo::IsFromDependenciesMatch)); QVERIFY(!(t.choose().hints & ProjectPartInfo::IsFromDependenciesMatch));
} }
namespace {
class TestToolchain : public ProjectExplorer::ToolChain
{
public:
TestToolchain() : ProjectExplorer::ToolChain("dummy") {}
private:
MacroInspectionRunner createMacroInspectionRunner() const override { return {}; }
Utils::LanguageExtensions languageExtensions(const QStringList &) const override { return {}; }
Utils::WarningFlags warningFlags(const QStringList &) const override { return {}; }
BuiltInHeaderPathsRunner createBuiltInHeaderPathsRunner(
const Utils::Environment &) const override { return {}; }
void addToEnvironment(Utils::Environment &) const override {}
Utils::FilePath makeCommand(const Utils::Environment &) const override { return {}; }
QList<Utils::OutputLineParser *> createOutputParsers() const override { return {}; }
std::unique_ptr<ProjectExplorer::ToolChainConfigWidget> createConfigurationWidget() override
{
return {};
};
};
class ProjectInfoGeneratorTest
{
public:
ProjectInfo generate()
{
QFutureInterface<ProjectInfo> fi;
TestToolchain aToolChain;
projectUpdateInfo.rawProjectParts += rawProjectPart;
projectUpdateInfo.cxxToolChain = &aToolChain;
projectUpdateInfo.cToolChain = &aToolChain;
ProjectInfoGenerator generator(fi, projectUpdateInfo);
return generator.generate();
}
ProjectExplorer::ProjectUpdateInfo projectUpdateInfo;
ProjectExplorer::RawProjectPart rawProjectPart;
};
}
void CppToolsPlugin::test_projectInfoGenerator_createNoProjectPartsForEmptyFileList()
{
ProjectInfoGeneratorTest t;
const ProjectInfo projectInfo = t.generate();
QVERIFY(projectInfo.projectParts().isEmpty());
}
void CppToolsPlugin::test_projectInfoGenerator_createSingleProjectPart()
{
ProjectInfoGeneratorTest t;
t.rawProjectPart.files = QStringList{ "foo.cpp", "foo.h"};
const ProjectInfo projectInfo = t.generate();
QCOMPARE(projectInfo.projectParts().size(), 1);
}
void CppToolsPlugin::test_projectInfoGenerator_createMultipleProjectParts()
{
ProjectInfoGeneratorTest t;
t.rawProjectPart.files = QStringList{ "foo.cpp", "foo.h", "bar.c", "bar.h" };
const ProjectInfo projectInfo = t.generate();
QCOMPARE(projectInfo.projectParts().size(), 2);
}
void CppToolsPlugin::test_projectInfoGenerator_projectPartIndicatesObjectiveCExtensionsByDefault()
{
ProjectInfoGeneratorTest t;
t.rawProjectPart.files = QStringList{ "foo.mm" };
const ProjectInfo projectInfo = t.generate();
QCOMPARE(projectInfo.projectParts().size(), 1);
const ProjectPart &projectPart = *projectInfo.projectParts().at(0);
QVERIFY(projectPart.languageExtensions & Utils::LanguageExtension::ObjectiveC);
}
void CppToolsPlugin::test_projectInfoGenerator_projectPartHasLatestLanguageVersionByDefault()
{
ProjectInfoGeneratorTest t;
t.rawProjectPart.files = QStringList{ "foo.cpp" };
const ProjectInfo projectInfo = t.generate();
QCOMPARE(projectInfo.projectParts().size(), 1);
const ProjectPart &projectPart = *projectInfo.projectParts().at(0);
QCOMPARE(projectPart.languageVersion, Utils::LanguageVersion::LatestCxx);
}
void CppToolsPlugin::test_projectInfoGenerator_useMacroInspectionReportForLanguageVersion()
{
ProjectInfoGeneratorTest t;
t.projectUpdateInfo.cxxToolChainInfo.macroInspectionRunner = [](const QStringList &) {
return TestToolchain::MacroInspectionReport{ProjectExplorer::Macros(),
Utils::LanguageVersion::CXX17};
};
t.rawProjectPart.files = QStringList{ "foo.cpp" };
const ProjectInfo projectInfo = t.generate();
QCOMPARE(projectInfo.projectParts().size(), 1);
const ProjectPart &projectPart = *projectInfo.projectParts().at(0);
QCOMPARE(projectPart.languageVersion, Utils::LanguageVersion::CXX17);
}
void CppToolsPlugin::test_projectInfoGenerator_useCompilerFlagsForLanguageExtensions()
{
ProjectInfoGeneratorTest t;
t.rawProjectPart.files = QStringList{ "foo.cpp" };
t.rawProjectPart.flagsForCxx.languageExtensions = Utils::LanguageExtension::Microsoft;
const ProjectInfo projectInfo = t.generate();
QCOMPARE(projectInfo.projectParts().size(), 1);
const ProjectPart &projectPart = *projectInfo.projectParts().at(0);
QVERIFY(projectPart.languageExtensions & Utils::LanguageExtension::Microsoft);
}
void CppToolsPlugin::test_projectInfoGenerator_projectFileKindsMatchProjectPartVersion()
{
ProjectInfoGeneratorTest t;
t.rawProjectPart.files = QStringList{ "foo.h" };
const ProjectInfo projectInfo = t.generate();
QCOMPARE(projectInfo.projectParts().size(), 4);
QVERIFY(Utils::contains(projectInfo.projectParts(), [](const ProjectPart::Ptr &p) {
return p->languageVersion == Utils::LanguageVersion::LatestC
&& p->files.first().kind == ProjectFile::CHeader;
}));
QVERIFY(Utils::contains(projectInfo.projectParts(), [](const ProjectPart::Ptr &p) {
return p->languageVersion == Utils::LanguageVersion::LatestC
&& p->files.first().kind == ProjectFile::ObjCHeader;
}));
QVERIFY(Utils::contains(projectInfo.projectParts(), [](const ProjectPart::Ptr &p) {
return p->languageVersion == Utils::LanguageVersion::LatestCxx
&& p->files.first().kind == ProjectFile::CXXHeader;
}));
QVERIFY(Utils::contains(projectInfo.projectParts(), [](const ProjectPart::Ptr &p) {
return p->languageVersion == Utils::LanguageVersion::LatestCxx
&& p->files.first().kind == ProjectFile::ObjCXXHeader;
}));
}
} // namespace Internal } // namespace Internal
} // namespace CppTools } // namespace CppTools

View File

@@ -44,7 +44,6 @@ add_qtc_test(unittest GTEST
compare-operators.h compare-operators.h
conditionally-disabled-tests.h conditionally-disabled-tests.h
cppprojectfilecategorizer-test.cpp cppprojectfilecategorizer-test.cpp
cppprojectinfogenerator-test.cpp
dummyclangipcclient.h dummyclangipcclient.h
dynamicastmatcherdiagnosticcontainer-matcher.h dynamicastmatcherdiagnosticcontainer-matcher.h
eventspy.cpp eventspy.h eventspy.cpp eventspy.h
@@ -456,7 +455,6 @@ extend_qtc_test(unittest
projectpart.cpp projectpart.h projectpart.cpp projectpart.h
cppprojectfilecategorizer.cpp cppprojectfilecategorizer.h cppprojectfilecategorizer.cpp cppprojectfilecategorizer.h
projectinfo.cpp projectinfo.h projectinfo.cpp projectinfo.h
cppprojectinfogenerator.cpp cppprojectinfogenerator.cpp
cppprojectpartchooser.cpp cppprojectpartchooser.h cppprojectpartchooser.cpp cppprojectpartchooser.h
headerpathfilter.cpp headerpathfilter.h headerpathfilter.cpp headerpathfilter.h
) )

View File

@@ -1,177 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#include "googletest.h"
#include "gtest-qt-printing.h"
#include "mimedatabase-utilities.h"
#include <cpptools/cppprojectinfogenerator.h>
#include <cpptools/projectinfo.h>
#include <utils/mimetypes/mimedatabase.h>
using CppTools::Internal::ProjectInfoGenerator;
using CppTools::ProjectFile;
using CppTools::ProjectInfo;
using CppTools::ProjectPart;
using ProjectExplorer::Macros;
using ProjectExplorer::ProjectUpdateInfo;
using ProjectExplorer::RawProjectPart;
using ProjectExplorer::ToolChain;
using testing::Eq;
using testing::UnorderedElementsAre;
using testing::PrintToString;
namespace {
MATCHER_P2(IsProjectPart, languageVersion, fileKind,
std::string(negation ? "isn't" : "is")
+ " project part with language version " + PrintToString(languageVersion)
+ " and file kind " + PrintToString(fileKind))
{
const ProjectPart::Ptr &projectPart = arg;
return projectPart->languageVersion == languageVersion
&& projectPart->files.at(0).kind == fileKind;
}
class ProjectInfoGenerator : public ::testing::Test
{
protected:
void SetUp() override;
ProjectInfo generate();
protected:
ProjectUpdateInfo projectUpdateInfo;
RawProjectPart rawProjectPart;
};
TEST_F(ProjectInfoGenerator, CreateNoProjectPartsForEmptyFileList)
{
const ProjectInfo projectInfo = generate();
ASSERT_TRUE(projectInfo.projectParts().isEmpty());
}
TEST_F(ProjectInfoGenerator, CreateSingleProjectPart)
{
rawProjectPart.files = QStringList{ "foo.cpp", "foo.h"};
const ProjectInfo projectInfo = generate();
ASSERT_THAT(projectInfo.projectParts().size(), Eq(1));
}
TEST_F(ProjectInfoGenerator, CreateMultipleProjectParts)
{
rawProjectPart.files = QStringList{ "foo.cpp", "foo.h", "bar.c", "bar.h" };
const ProjectInfo projectInfo = generate();
ASSERT_THAT(projectInfo.projectParts().size(), Eq(2));
}
TEST_F(ProjectInfoGenerator, ProjectPartIndicatesObjectiveCExtensionsByDefault)
{
rawProjectPart.files = QStringList{ "foo.mm" };
const ProjectInfo projectInfo = generate();
ASSERT_THAT(projectInfo.projectParts().size(), Eq(1));
const ProjectPart &projectPart = *projectInfo.projectParts().at(0);
ASSERT_TRUE(projectPart.languageExtensions & Utils::LanguageExtension::ObjectiveC);
}
TEST_F(ProjectInfoGenerator, ProjectPartHasLatestLanguageVersionByDefault)
{
rawProjectPart.files = QStringList{ "foo.cpp" };
const ProjectInfo projectInfo = generate();
ASSERT_THAT(projectInfo.projectParts().size(), Eq(1));
const ProjectPart &projectPart = *projectInfo.projectParts().at(0);
ASSERT_THAT(projectPart.languageVersion, Eq(Utils::LanguageVersion::LatestCxx));
}
TEST_F(ProjectInfoGenerator, UseMacroInspectionReportForLanguageVersion)
{
projectUpdateInfo.cxxToolChainInfo.macroInspectionRunner = [](const QStringList &) {
return ToolChain::MacroInspectionReport{Macros(), Utils::LanguageVersion::CXX17};
};
rawProjectPart.files = QStringList{ "foo.cpp" };
const ProjectInfo projectInfo = generate();
ASSERT_THAT(projectInfo.projectParts().size(), Eq(1));
const ProjectPart &projectPart = *projectInfo.projectParts().at(0);
ASSERT_THAT(projectPart.languageVersion, Eq(Utils::LanguageVersion::CXX17));
}
TEST_F(ProjectInfoGenerator, UseCompilerFlagsForLanguageExtensions)
{
rawProjectPart.files = QStringList{ "foo.cpp" };
rawProjectPart.flagsForCxx.languageExtensions = Utils::LanguageExtension::Microsoft;
const ProjectInfo projectInfo = generate();
ASSERT_THAT(projectInfo.projectParts().size(), Eq(1));
const ProjectPart &projectPart = *projectInfo.projectParts().at(0);
ASSERT_TRUE(projectPart.languageExtensions & Utils::LanguageExtension::Microsoft);
}
TEST_F(ProjectInfoGenerator, ProjectFileKindsMatchProjectPartVersion)
{
rawProjectPart.files = QStringList{ "foo.h" };
const ProjectInfo projectInfo = generate();
ASSERT_THAT(projectInfo.projectParts(),
UnorderedElementsAre(IsProjectPart(Utils::LanguageVersion::LatestC, ProjectFile::CHeader),
IsProjectPart(Utils::LanguageVersion::LatestC, ProjectFile::ObjCHeader),
IsProjectPart(Utils::LanguageVersion::LatestCxx, ProjectFile::CXXHeader),
IsProjectPart(Utils::LanguageVersion::LatestCxx, ProjectFile::ObjCXXHeader)));
}
void ProjectInfoGenerator::SetUp()
{
ASSERT_TRUE(MimeDataBaseUtilities::addCppToolsMimeTypes());
}
ProjectInfo ProjectInfoGenerator::generate()
{
QFutureInterface<ProjectInfo> fi;
ProjectExplorer::ConcreteToolChain aToolChain;
projectUpdateInfo.rawProjectParts += rawProjectPart;
projectUpdateInfo.cxxToolChain = &aToolChain;
projectUpdateInfo.cToolChain = &aToolChain;
::ProjectInfoGenerator generator(fi, projectUpdateInfo);
return generator.generate();
}
} // anonymous namespace

View File

@@ -66,7 +66,6 @@ SOURCES += \
clientserverinprocess-test.cpp \ clientserverinprocess-test.cpp \
clientserveroutsideprocess-test.cpp \ clientserveroutsideprocess-test.cpp \
cppprojectfilecategorizer-test.cpp \ cppprojectfilecategorizer-test.cpp \
cppprojectinfogenerator-test.cpp \
fakeprocess.cpp \ fakeprocess.cpp \
gtest-creator-printing.cpp \ gtest-creator-printing.cpp \
gtest-qt-printing.cpp \ gtest-qt-printing.cpp \

View File

@@ -175,7 +175,6 @@ Project {
"compilationdatabaseutils-test.cpp", "compilationdatabaseutils-test.cpp",
"conditionally-disabled-tests.h", "conditionally-disabled-tests.h",
"cppprojectfilecategorizer-test.cpp", "cppprojectfilecategorizer-test.cpp",
"cppprojectinfogenerator-test.cpp",
"createtablesqlstatementbuilder-test.cpp", "createtablesqlstatementbuilder-test.cpp",
"dummyclangipcclient.h", "dummyclangipcclient.h",
"dynamicastmatcherdiagnosticcontainer-matcher.h", "dynamicastmatcherdiagnosticcontainer-matcher.h",
@@ -488,7 +487,6 @@ Project {
"cppprojectfile.h", "cppprojectfile.h",
"cppprojectfilecategorizer.cpp", "cppprojectfilecategorizer.cpp",
"cppprojectfilecategorizer.h", "cppprojectfilecategorizer.h",
"cppprojectinfogenerator.cpp",
"cppprojectpartchooser.cpp", "cppprojectpartchooser.cpp",
"cppprojectpartchooser.h", "cppprojectpartchooser.h",
"headerpathfilter.cpp", "headerpathfilter.cpp",