forked from qt-creator/qt-creator
		
	CompilationDatabaseProjectManager: Move tests to plugin
Change-Id: Ife4ee68cdbd1560830f294610f8fab40653a4f5b Reviewed-by: Christian Stenger <christian.stenger@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
		
				
					committed by
					
						
						Christian Stenger
					
				
			
			
				
	
			
			
			
						parent
						
							1e912f7318
						
					
				
				
					commit
					da588b7cc4
				
			@@ -25,6 +25,8 @@
 | 
			
		||||
 | 
			
		||||
#include "compilationdatabasetests.h"
 | 
			
		||||
 | 
			
		||||
#include "compilationdatabaseutils.h"
 | 
			
		||||
 | 
			
		||||
#include <coreplugin/icore.h>
 | 
			
		||||
#include <cpptools/cpptoolstestcase.h>
 | 
			
		||||
#include <cpptools/projectinfo.h>
 | 
			
		||||
@@ -37,9 +39,11 @@
 | 
			
		||||
 | 
			
		||||
#include <QtTest>
 | 
			
		||||
 | 
			
		||||
using namespace CppTools;
 | 
			
		||||
using namespace ProjectExplorer;
 | 
			
		||||
 | 
			
		||||
namespace CompilationDatabaseProjectManager {
 | 
			
		||||
namespace Internal {
 | 
			
		||||
 | 
			
		||||
CompilationDatabaseTests::CompilationDatabaseTests(QObject *parent)
 | 
			
		||||
    : QObject(parent)
 | 
			
		||||
@@ -54,7 +58,7 @@ void CompilationDatabaseTests::initTestCase()
 | 
			
		||||
        QSKIP("This test requires at least one kit to be present.");
 | 
			
		||||
 | 
			
		||||
    ToolChain *toolchain = ToolChainManager::toolChain([](const ToolChain *tc) {
 | 
			
		||||
        return tc->isValid() && tc->language() == Constants::CXX_LANGUAGE_ID;
 | 
			
		||||
        return tc->isValid() && tc->language() == ProjectExplorer::Constants::CXX_LANGUAGE_ID;
 | 
			
		||||
    });
 | 
			
		||||
    if (!toolchain)
 | 
			
		||||
        QSKIP("This test requires that there is at least one C++ toolchain present.");
 | 
			
		||||
@@ -95,6 +99,186 @@ void CompilationDatabaseTests::testProject_data()
 | 
			
		||||
    addTestRow("llvm/compile_commands.json");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
class CompilationDatabaseUtilsTestData
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    QStringList getSplitCommandLine(const QString &commandLine)
 | 
			
		||||
    {
 | 
			
		||||
        QSet<QString> fc;
 | 
			
		||||
        return splitCommandLine(commandLine, fc);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    QStringList getFilteredFlags()
 | 
			
		||||
    {
 | 
			
		||||
        filteredFlags(fileName, workingDir, flags, headerPaths, macros, fileKind, sysRoot);
 | 
			
		||||
        return flags;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    HeaderPaths headerPaths;
 | 
			
		||||
    Macros macros;
 | 
			
		||||
    CppTools::ProjectFile::Kind fileKind = CppTools::ProjectFile::Unclassified;
 | 
			
		||||
    QStringList flags;
 | 
			
		||||
    QString fileName;
 | 
			
		||||
    QString workingDir;
 | 
			
		||||
    QString sysRoot;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CompilationDatabaseTests::testFilterEmptyFlags()
 | 
			
		||||
{
 | 
			
		||||
    QVERIFY(CompilationDatabaseUtilsTestData().getFilteredFlags().isEmpty());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CompilationDatabaseTests::testFilterFromFilename()
 | 
			
		||||
{
 | 
			
		||||
    QCOMPARE(filterFromFileName(QStringList{"-o", "foo.o"}, "foo"), QStringList{"-o"});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CompilationDatabaseTests::testFilterArguments()
 | 
			
		||||
{
 | 
			
		||||
    using Utils::HostOsInfo;
 | 
			
		||||
    const char winPath1[] = "C:\\Qt\\5.9.2\\mingw53_32\\include";
 | 
			
		||||
    const char otherPath1[] = "/Qt/5.9.2/mingw53_32/include";
 | 
			
		||||
    const char winPath2[] = "C:\\Qt\\5.9.2\\mingw53_32\\include\\QtWidgets";
 | 
			
		||||
    const char otherPath2[] = "/Qt/5.9.2/mingw53_32/include/QtWidgets";
 | 
			
		||||
    CompilationDatabaseUtilsTestData testData;
 | 
			
		||||
    testData.fileName = "compileroptionsbuilder.cpp";
 | 
			
		||||
    testData.workingDir = "C:/build-qtcreator-MinGW_32bit-Debug";
 | 
			
		||||
    testData.flags = filterFromFileName(
 | 
			
		||||
        QStringList{"clang++",
 | 
			
		||||
                    "-c",
 | 
			
		||||
                    "-m32",
 | 
			
		||||
                    "-target",
 | 
			
		||||
                    "i686-w64-mingw32",
 | 
			
		||||
                    "-std=gnu++14",
 | 
			
		||||
                    "-fcxx-exceptions",
 | 
			
		||||
                    "-fexceptions",
 | 
			
		||||
                    "-DUNICODE",
 | 
			
		||||
                    "-DRELATIVE_PLUGIN_PATH=\"../lib/qtcreator/plugins\"",
 | 
			
		||||
                    "-DQT_CREATOR",
 | 
			
		||||
                    "-I",
 | 
			
		||||
                    QString::fromUtf8(HostOsInfo::isWindowsHost() ? winPath1 : otherPath1),
 | 
			
		||||
                    "-I",
 | 
			
		||||
                    QString::fromUtf8(HostOsInfo::isWindowsHost() ? winPath2 : otherPath2),
 | 
			
		||||
                    "-x",
 | 
			
		||||
                    "c++",
 | 
			
		||||
                    QString("--sysroot=") + (HostOsInfo::isWindowsHost()
 | 
			
		||||
                        ? "C:\\sysroot\\embedded" : "/opt/sysroot/embedded"),
 | 
			
		||||
                    "C:\\qt-creator\\src\\plugins\\cpptools\\compileroptionsbuilder.cpp"},
 | 
			
		||||
        "compileroptionsbuilder");
 | 
			
		||||
 | 
			
		||||
    testData.getFilteredFlags();
 | 
			
		||||
 | 
			
		||||
    QCOMPARE(testData.flags, (QStringList{"-m32", "-target", "i686-w64-mingw32", "-std=gnu++14",
 | 
			
		||||
                                          "-fcxx-exceptions", "-fexceptions"}));
 | 
			
		||||
    QCOMPARE(testData.headerPaths,
 | 
			
		||||
             (HeaderPaths{{QString::fromUtf8(HostOsInfo::isWindowsHost() ? winPath1 : otherPath1),
 | 
			
		||||
                           HeaderPathType::User},
 | 
			
		||||
                          {QString::fromUtf8(HostOsInfo::isWindowsHost() ? winPath2 : otherPath2),
 | 
			
		||||
                           HeaderPathType::User}}));
 | 
			
		||||
    QCOMPARE(testData.macros, (Macros{{"UNICODE", "1"},
 | 
			
		||||
                                      {"RELATIVE_PLUGIN_PATH", "\"../lib/qtcreator/plugins\""},
 | 
			
		||||
                                      {"QT_CREATOR", "1"}}));
 | 
			
		||||
    QCOMPARE(testData.fileKind, CppTools::ProjectFile::Kind::CXXSource);
 | 
			
		||||
    QCOMPARE(testData.sysRoot, HostOsInfo::isWindowsHost() ? QString("C:\\sysroot\\embedded")
 | 
			
		||||
                                                           : QString("/opt/sysroot/embedded"));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static QString kCmakeCommand
 | 
			
		||||
    = "C:\\PROGRA~2\\MICROS~2\\2017\\COMMUN~1\\VC\\Tools\\MSVC\\1415~1.267\\bin\\HostX64\\x64\\cl."
 | 
			
		||||
      "exe "
 | 
			
		||||
      "/nologo "
 | 
			
		||||
      "/TP "
 | 
			
		||||
      "-DUNICODE "
 | 
			
		||||
      "-D_HAS_EXCEPTIONS=0 "
 | 
			
		||||
      "-Itools\\clang\\lib\\Sema "
 | 
			
		||||
      "/DWIN32 "
 | 
			
		||||
      "/D_WINDOWS "
 | 
			
		||||
      "/Zc:inline "
 | 
			
		||||
      "/Zc:strictStrings "
 | 
			
		||||
      "/Oi "
 | 
			
		||||
      "/Zc:rvalueCast "
 | 
			
		||||
      "/W4 "
 | 
			
		||||
      "-wd4141 "
 | 
			
		||||
      "-wd4146 "
 | 
			
		||||
      "/MDd "
 | 
			
		||||
      "/Zi "
 | 
			
		||||
      "/Ob0 "
 | 
			
		||||
      "/Od "
 | 
			
		||||
      "/RTC1 "
 | 
			
		||||
      "/EHs-c- "
 | 
			
		||||
      "/GR "
 | 
			
		||||
      "/Fotools\\clang\\lib\\Sema\\CMakeFiles\\clangSema.dir\\SemaCodeComplete.cpp.obj "
 | 
			
		||||
      "/FdTARGET_COMPILE_PDB "
 | 
			
		||||
      "/FS "
 | 
			
		||||
      "-c "
 | 
			
		||||
      "C:\\qt_llvm\\tools\\clang\\lib\\Sema\\SemaCodeComplete.cpp";
 | 
			
		||||
 | 
			
		||||
void CompilationDatabaseTests::testSplitFlags()
 | 
			
		||||
{
 | 
			
		||||
    CompilationDatabaseUtilsTestData testData;
 | 
			
		||||
    testData.flags = testData.getSplitCommandLine(kCmakeCommand);
 | 
			
		||||
 | 
			
		||||
    QCOMPARE(testData.flags.size(), 27);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CompilationDatabaseTests::testSplitFlagsWithEscapedQuotes()
 | 
			
		||||
{
 | 
			
		||||
    CompilationDatabaseUtilsTestData testData;
 | 
			
		||||
    testData.flags = testData.getSplitCommandLine("-DRC_FILE_VERSION=\\\"7.0.0\\\" "
 | 
			
		||||
                             "-DRELATIVE_PLUGIN_PATH=\"../lib/qtcreator/plugins\"");
 | 
			
		||||
 | 
			
		||||
    QCOMPARE(testData.flags.size(), 2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CompilationDatabaseTests::testFilterCommand()
 | 
			
		||||
{
 | 
			
		||||
    CompilationDatabaseUtilsTestData testData;
 | 
			
		||||
    testData.fileName = "SemaCodeComplete.cpp";
 | 
			
		||||
    testData.workingDir = "C:/build-qt_llvm-msvc2017_64bit-Debug";
 | 
			
		||||
    testData.flags = filterFromFileName(testData.getSplitCommandLine(kCmakeCommand),
 | 
			
		||||
                                        "SemaCodeComplete");
 | 
			
		||||
    testData.getFilteredFlags();
 | 
			
		||||
 | 
			
		||||
    QCOMPARE(testData.flags,
 | 
			
		||||
             (QStringList{"/Zc:inline", "/Zc:strictStrings", "/Zc:rvalueCast", "/Zi"}));
 | 
			
		||||
    QCOMPARE(testData.headerPaths,
 | 
			
		||||
             (HeaderPaths{{"C:/build-qt_llvm-msvc2017_64bit-Debug/tools\\clang\\lib\\Sema",
 | 
			
		||||
                           HeaderPathType::User}}));
 | 
			
		||||
    QCOMPARE(testData.macros, (Macros{{"UNICODE", "1"}, {"_HAS_EXCEPTIONS", "0"}, {"WIN32", "1"},
 | 
			
		||||
                                      {"_WINDOWS", "1"}}));
 | 
			
		||||
    QCOMPARE(testData.fileKind, CppTools::ProjectFile::Kind::CXXSource);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CompilationDatabaseTests::testFileKindDifferentFromExtension()
 | 
			
		||||
{
 | 
			
		||||
    CompilationDatabaseUtilsTestData testData;
 | 
			
		||||
    testData.fileName = "foo.c";
 | 
			
		||||
    testData.flags = QStringList{"-xc++"};
 | 
			
		||||
    testData.getFilteredFlags();
 | 
			
		||||
 | 
			
		||||
    QCOMPARE(testData.fileKind, CppTools::ProjectFile::Kind::CXXSource);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CompilationDatabaseTests::testFileKindDifferentFromExtension2()
 | 
			
		||||
{
 | 
			
		||||
    CompilationDatabaseUtilsTestData testData;
 | 
			
		||||
    testData.fileName = "foo.cpp";
 | 
			
		||||
    testData.flags = QStringList{"-x", "c"};
 | 
			
		||||
    testData.getFilteredFlags();
 | 
			
		||||
 | 
			
		||||
    QCOMPARE(testData.fileKind, CppTools::ProjectFile::Kind::CSource);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CompilationDatabaseTests::testSkipOutputFiles()
 | 
			
		||||
{
 | 
			
		||||
    CompilationDatabaseUtilsTestData testData;
 | 
			
		||||
    testData.flags = filterFromFileName(QStringList{"-o", "foo.o"}, "foo");
 | 
			
		||||
 | 
			
		||||
    QVERIFY(testData.getFilteredFlags().isEmpty());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CompilationDatabaseTests::addTestRow(const QByteArray &relativeFilePath)
 | 
			
		||||
{
 | 
			
		||||
    const QString absoluteFilePath = m_tmpDir->absolutePath(relativeFilePath);
 | 
			
		||||
@@ -102,4 +286,5 @@ void CompilationDatabaseTests::addTestRow(const QByteArray &relativeFilePath)
 | 
			
		||||
    QTest::newRow(relativeFilePath.constData()) << absoluteFilePath;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Internal
 | 
			
		||||
} // namespace CompilationDatabaseProjectManager
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user