diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index 947d2c2d356..b819fd75598 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -232,6 +232,15 @@ private slots: void test_projectPartChooser_indicateFallbacktoProjectPartFromModelManager(); void test_projectPartChooser_indicateFromDependencies(); 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 private: diff --git a/src/plugins/cpptools/cpptoolsunittestfiles.pri b/src/plugins/cpptools/cpptoolsunittestfiles.pri index 2c408862171..913a47e45ee 100644 --- a/src/plugins/cpptools/cpptoolsunittestfiles.pri +++ b/src/plugins/cpptools/cpptoolsunittestfiles.pri @@ -10,7 +10,6 @@ HEADERS += \ $$PWD/projectpart.h \ $$PWD/cppprojectfilecategorizer.h \ $$PWD/projectinfo.h \ - $$PWD/cppprojectinfogenerator.cpp \ $$PWD/headerpathfilter.h SOURCES += \ @@ -19,5 +18,4 @@ SOURCES += \ $$PWD/projectpart.cpp \ $$PWD/cppprojectfilecategorizer.cpp \ $$PWD/projectinfo.cpp \ - $$PWD/cppprojectinfogenerator.cpp \ $$PWD/headerpathfilter.cpp diff --git a/src/plugins/cpptools/projectinfo_test.cpp b/src/plugins/cpptools/projectinfo_test.cpp index bbac13216d8..04b2940e333 100644 --- a/src/plugins/cpptools/projectinfo_test.cpp +++ b/src/plugins/cpptools/projectinfo_test.cpp @@ -23,8 +23,13 @@ ** ****************************************************************************/ +#include "cppprojectinfogenerator.h" #include "cppprojectpartchooser.h" #include "cpptoolsplugin.h" +#include "projectinfo.h" + +#include +#include #include @@ -318,5 +323,149 @@ void CppToolsPlugin::test_projectPartChooser_doNotIndicateFromDependencies() 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 createOutputParsers() const override { return {}; } + std::unique_ptr createConfigurationWidget() override + { + return {}; + }; +}; + +class ProjectInfoGeneratorTest +{ +public: + ProjectInfo generate() + { + QFutureInterface 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 CppTools diff --git a/tests/unit/unittest/CMakeLists.txt b/tests/unit/unittest/CMakeLists.txt index a941902d6bb..fda3b766031 100644 --- a/tests/unit/unittest/CMakeLists.txt +++ b/tests/unit/unittest/CMakeLists.txt @@ -44,7 +44,6 @@ add_qtc_test(unittest GTEST compare-operators.h conditionally-disabled-tests.h cppprojectfilecategorizer-test.cpp - cppprojectinfogenerator-test.cpp dummyclangipcclient.h dynamicastmatcherdiagnosticcontainer-matcher.h eventspy.cpp eventspy.h @@ -456,7 +455,6 @@ extend_qtc_test(unittest projectpart.cpp projectpart.h cppprojectfilecategorizer.cpp cppprojectfilecategorizer.h projectinfo.cpp projectinfo.h - cppprojectinfogenerator.cpp cppprojectinfogenerator.cpp cppprojectpartchooser.cpp cppprojectpartchooser.h headerpathfilter.cpp headerpathfilter.h ) diff --git a/tests/unit/unittest/cppprojectinfogenerator-test.cpp b/tests/unit/unittest/cppprojectinfogenerator-test.cpp deleted file mode 100644 index 98eb8feeaa3..00000000000 --- a/tests/unit/unittest/cppprojectinfogenerator-test.cpp +++ /dev/null @@ -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 -#include - -#include - -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 fi; - ProjectExplorer::ConcreteToolChain aToolChain; - - projectUpdateInfo.rawProjectParts += rawProjectPart; - projectUpdateInfo.cxxToolChain = &aToolChain; - projectUpdateInfo.cToolChain = &aToolChain; - ::ProjectInfoGenerator generator(fi, projectUpdateInfo); - - return generator.generate(); -} - -} // anonymous namespace diff --git a/tests/unit/unittest/unittest.pro b/tests/unit/unittest/unittest.pro index 0454757957c..c94c5f320de 100644 --- a/tests/unit/unittest/unittest.pro +++ b/tests/unit/unittest/unittest.pro @@ -66,7 +66,6 @@ SOURCES += \ clientserverinprocess-test.cpp \ clientserveroutsideprocess-test.cpp \ cppprojectfilecategorizer-test.cpp \ - cppprojectinfogenerator-test.cpp \ fakeprocess.cpp \ gtest-creator-printing.cpp \ gtest-qt-printing.cpp \ diff --git a/tests/unit/unittest/unittest.qbs b/tests/unit/unittest/unittest.qbs index c2596483839..3120c3f2245 100644 --- a/tests/unit/unittest/unittest.qbs +++ b/tests/unit/unittest/unittest.qbs @@ -175,7 +175,6 @@ Project { "compilationdatabaseutils-test.cpp", "conditionally-disabled-tests.h", "cppprojectfilecategorizer-test.cpp", - "cppprojectinfogenerator-test.cpp", "createtablesqlstatementbuilder-test.cpp", "dummyclangipcclient.h", "dynamicastmatcherdiagnosticcontainer-matcher.h", @@ -488,7 +487,6 @@ Project { "cppprojectfile.h", "cppprojectfilecategorizer.cpp", "cppprojectfilecategorizer.h", - "cppprojectinfogenerator.cpp", "cppprojectpartchooser.cpp", "cppprojectpartchooser.h", "headerpathfilter.cpp",