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

0001 /*
0002     SPDX-FileCopyrightText: 2010 Andreas Pakulat <apaku@gmx.de>
0003     SPDX-FileCopyrightText: 2014 Sergey Kalinichev <kalinichev.so.0@gmail.com>
0004 
0005     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-or-later
0006 */
0007 
0008 #include "test_definesandincludes.h"
0009 
0010 #include <QTest>
0011 
0012 #include <interfaces/iproject.h>
0013 #include <interfaces/iprojectcontroller.h>
0014 #include <project/projectmodel.h>
0015 #include <tests/autotestshell.h>
0016 #include <tests/testcore.h>
0017 #include <tests/testhelpers.h>
0018 #include <tests/projectsgenerator.h>
0019 
0020 #include "idefinesandincludesmanager.h"
0021 
0022 using namespace KDevelop;
0023 
0024 void TestDefinesAndIncludes::cleanupTestCase()
0025 {
0026     TestCore::shutdown();
0027 }
0028 
0029 void TestDefinesAndIncludes::initTestCase()
0030 {
0031     AutoTestShell::init({QStringLiteral("kdevdefinesandincludesmanager"), QStringLiteral("KDevCustomBuildSystem"), QStringLiteral("KDevStandardOutputView")});
0032     TestCore::initialize();
0033 }
0034 
0035 void TestDefinesAndIncludes::cleanup()
0036 {
0037     ICore::self()->projectController()->closeProject( m_currentProject );
0038 }
0039 
0040 void TestDefinesAndIncludes::loadSimpleProject()
0041 {
0042     m_currentProject = ProjectsGenerator::GenerateSimpleProject();
0043     QVERIFY( m_currentProject );
0044 
0045     auto manager = IDefinesAndIncludesManager::manager();
0046     QVERIFY( manager );
0047     const auto actualIncludes = manager->includes( m_currentProject->projectItem(), IDefinesAndIncludesManager::UserDefined );
0048     const auto actualDefines = manager->defines( m_currentProject->projectItem(), IDefinesAndIncludesManager::UserDefined );
0049 
0050     qDebug() << actualDefines << actualIncludes;
0051 
0052     QCOMPARE( actualIncludes, Path::List() << Path( QDir::rootPath() + QStringLiteral("usr/include/mydir") ) );
0053 
0054     Defines defines;
0055     defines.insert( QStringLiteral("_DEBUG"), QString() );
0056     defines.insert( QStringLiteral("VARIABLE"), QStringLiteral("VALUE") );
0057     QCOMPARE( actualDefines, defines );
0058 
0059     QVERIFY(!manager->parserArguments(m_currentProject->path().path() + "/src/main.cpp").isEmpty());
0060 }
0061 
0062 void TestDefinesAndIncludes::loadMultiPathProject()
0063 {
0064     m_currentProject = ProjectsGenerator::GenerateMultiPathProject();
0065     QVERIFY( m_currentProject );
0066 
0067     auto manager = IDefinesAndIncludesManager::manager();
0068     QVERIFY( manager );
0069     Path::List includes = Path::List() << Path( QDir::rootPath() + QStringLiteral("usr/include/otherdir") );
0070 
0071     QHash<QString,QString> defines;
0072     defines.insert(QStringLiteral("SOURCE"), QStringLiteral("CONTENT"));
0073     defines.insert(QStringLiteral("_COPY"), QString());
0074 
0075     QCOMPARE( manager->includes( m_currentProject->projectItem(), IDefinesAndIncludesManager::UserDefined ), includes );
0076     QCOMPARE( manager->defines( m_currentProject->projectItem(), IDefinesAndIncludesManager::UserDefined ), defines );
0077 
0078     ProjectBaseItem* mainfile = nullptr;
0079     const auto& fileSet = m_currentProject->fileSet();
0080     for (const auto& file : fileSet) {
0081         const auto& files = m_currentProject->filesForPath(file);
0082         for (auto i: files) {
0083             if( i->text() == QLatin1String("main.cpp") ) {
0084                 mainfile = i;
0085                 break;
0086             }
0087         }
0088     }
0089     QVERIFY(mainfile);
0090 
0091     includes.prepend(Path(QDir::rootPath() + QStringLiteral("usr/local/include/mydir")));
0092     defines.insert(QStringLiteral("BUILD"), QStringLiteral("debug"));
0093     qDebug() << includes << "VS" << manager->includes( mainfile, IDefinesAndIncludesManager::UserDefined );
0094     qDebug() << mainfile << mainfile->path();
0095     QCOMPARE(manager->includes( mainfile, IDefinesAndIncludesManager::UserDefined ), includes);
0096     QCOMPARE(defines, manager->defines( mainfile, IDefinesAndIncludesManager::UserDefined ));
0097     QVERIFY(!manager->parserArguments(mainfile).isEmpty());
0098 }
0099 
0100 void TestDefinesAndIncludes::testNoProjectIncludeDirectories()
0101 {
0102     m_currentProject = ProjectsGenerator::GenerateSimpleProjectWithOutOfProjectFiles();
0103     QVERIFY(m_currentProject);
0104 
0105     auto manager = KDevelop::IDefinesAndIncludesManager::manager();
0106     QVERIFY(manager);
0107 
0108     auto projectIncludes = manager->includes(m_currentProject->projectItem(), IDefinesAndIncludesManager::UserDefined);
0109 
0110     Path includePath1(m_currentProject->path().path() + QDir::separator() + "include1.h");
0111     Path includePath2(m_currentProject->path().path() + QDir::separator() + "include2.h");
0112 
0113     QVERIFY(!projectIncludes.contains(includePath1));
0114     QVERIFY(!projectIncludes.contains(includePath2));
0115 
0116     auto noProjectIncludes = manager->includes(m_currentProject->path().path() + "/src/main.cpp");
0117     QVERIFY(noProjectIncludes.contains(includePath1));
0118     QVERIFY(noProjectIncludes.contains(includePath2));
0119 }
0120 
0121 void TestDefinesAndIncludes::testEmptyProject()
0122 {
0123     m_currentProject = ProjectsGenerator::GenerateEmptyProject();
0124     QVERIFY(m_currentProject);
0125 
0126     auto manager = KDevelop::IDefinesAndIncludesManager::manager();
0127     QVERIFY(manager);
0128 
0129     auto projectIncludes = manager->includes(m_currentProject->projectItem());
0130     auto projectDefines = manager->defines(m_currentProject->projectItem());
0131     auto parserArguments = manager->parserArguments(m_currentProject->projectItem());
0132 
0133     QVERIFY(projectIncludes.isEmpty());
0134     QVERIFY(projectDefines.isEmpty());
0135     QVERIFY(parserArguments.isEmpty());
0136 }
0137 
0138 QTEST_MAIN(TestDefinesAndIncludes)
0139 
0140 #include "moc_test_definesandincludes.cpp"