diff --git a/plugins/clang/tests/test_files.cpp b/plugins/clang/tests/test_files.cpp index 84844f7952..a27e32c4d9 100644 --- a/plugins/clang/tests/test_files.cpp +++ b/plugins/clang/tests/test_files.cpp @@ -1,118 +1,130 @@ /************************************************************************************* * Copyright (C) 2013 by Milian Wolff * * Copyright (C) 2013 Olivier de Gaalon * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * * as published by the Free Software Foundation; either version 2 * * of the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * *************************************************************************************/ #include "test_files.h" #include #include #include #include #include #include #include #include "testfilepaths.h" #include "testprovider.h" //Include all used json tests, otherwise "Test not found" #include #include #include #include #include #include +#include using namespace KDevelop; QTEST_MAIN(TestFiles) +namespace { +bool isCudaAvailable() +{ + return QProcess::execute(QStringLiteral("clang"), {QStringLiteral("-xcuda"), QStringLiteral("-fsyntax-only"), QProcess::nullDevice()}) == 0; +} +} + void TestFiles::initTestCase() { qputenv("KDEV_CLANG_JSON_TEST_RUN", "1"); qputenv("KDEV_CLANG_EXTRA_ARGUMENTS", "-Wno-unused-variable -Wno-unused-parameter -Wno-unused-comparison -Wno-unused-value -Wno-unused-private-field -Wno-ignored-attributes"); QLoggingCategory::setFilterRules(QStringLiteral("*.debug=false\ndefault.debug=true\nkdevelop.plugins.clang.debug=true\n")); QVERIFY(qputenv("KDEV_CLANG_DISPLAY_DIAGS", "1")); AutoTestShell::init({"kdevclangsupport"}); TestCore::initialize(Core::NoUi); DUChain::self()->disablePersistentStorage(); Core::self()->languageController()->backgroundParser()->setDelay(0); CodeRepresentation::setDiskChangesForbidden(true); m_provider = new TestEnvironmentProvider; IDefinesAndIncludesManager::manager()->registerBackgroundProvider(m_provider); } void TestFiles::cleanupTestCase() { delete m_provider; TestCore::shutdown(); } void TestFiles::cleanup() { m_provider->clear(); } void TestFiles::testFiles_data() { QTest::addColumn("fileName"); const QString testDirPath = TEST_FILES_DIR; - const QStringList files = QDir(testDirPath).entryList({"*.h", "*.cpp", "*.c", "*.cl", "*.cu"}, QDir::Files); + auto patterns = QStringList{"*.h", "*.cpp", "*.c", "*.cl"}; + if (isCudaAvailable()) { + patterns.append("*.cu"); + } + const QStringList files = QDir(testDirPath).entryList(patterns, QDir::Files); for (const QString& file : files) { QTest::newRow(file.toUtf8().constData()) << QString(testDirPath + '/' + file); } } void TestFiles::testFiles() { QFETCH(QString, fileName); if (QTest::currentDataTag() == QLatin1String("lambdas.cpp")) { m_provider->parserArguments += "-std=c++14"; } const IndexedString indexedFileName(fileName); ReferencedTopDUContext top = DUChain::self()->waitForUpdate(indexedFileName, TopDUContext::AllDeclarationsContextsAndUses); if (strcmp("test.cl", QTest::currentDataTag()) == 0) { if (!top) { QSKIP("Likely outdated shared-mime-info around, which doesn't know about the text/x-opencl-src mime type"); } } QVERIFY(top); DUChainReadLocker lock; DeclarationValidator validator; top->visit(validator); const auto problems = top->problems(); for (auto& problem : problems) { qDebug() << problem; } QEXPECT_FAIL("lambdas.cpp", "capture with identifier and initializer aren't visited apparently", Abort); QVERIFY(validator.testsPassed()); if (!QTest::currentDataTag() || strcmp("invalid.cpp", QTest::currentDataTag()) != 0) { QVERIFY(top->problems().isEmpty()); } }