File indexing completed on 2024-05-12 04:38:19

0001 /*
0002     SPDX-FileCopyrightText: 2021 Igor Kushnir <igorkuo@gmail.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "languagecontrollertestbase.h"
0008 
0009 #include "testfilepaths.h"
0010 
0011 #include <ilanguagecontroller.h>
0012 #include <language/backgroundparser/backgroundparser.h>
0013 #include <languagecontroller.h>
0014 #include <shell/core.h>
0015 #include <tests/autotestshell.h>
0016 #include <tests/testcore.h>
0017 #include <tests/testhelpers.h>
0018 
0019 #include <QByteArray>
0020 #include <QFileInfo>
0021 #include <QString>
0022 #include <QTest>
0023 #include <QUrl>
0024 
0025 using namespace KDevelop;
0026 
0027 namespace {
0028 QUrl testUrl(const QString& filename)
0029 {
0030     return QUrl::fromLocalFile(filename);
0031 }
0032 
0033 QUrl existentTestUrl(const QString& filename)
0034 {
0035     const QString filePath = TEST_FILES_DIR "/" + filename;
0036     QVERIFY_RETURN(QFileInfo::exists(filePath), QUrl{});
0037     return QUrl::fromLocalFile(filePath);
0038 }
0039 }
0040 
0041 LanguageControllerTestBase::LanguageControllerTestBase(QObject* parent)
0042     : QObject(parent)
0043     , m_differentLanguagesUrls{
0044         {testUrl("plus.cc"), "clang"},
0045         {testUrl("project.cmake"), "CMake"},
0046         {testUrl("patch.diff"), "diff"},
0047         {testUrl("gui.qml"), "qml/js"},
0048     }
0049 {
0050 }
0051 
0052 void LanguageControllerTestBase::initTestCase()
0053 {
0054     AutoTestShell::init({"kdevclangsupport", "kdevpatchreview", "kdevqmljs",
0055                          "KDevCMakeManager", "KDevCMakeBuilder", "KDevMakeBuilder", "KDevStandardOutputView"});
0056     TestCore::initialize();
0057     m_subject = Core::self()->languageController();
0058 }
0059 
0060 void LanguageControllerTestBase::init()
0061 {
0062     Core::self()->languageControllerInternal()->initialize();
0063     m_subject->backgroundParser()->suspend();
0064 }
0065 
0066 void LanguageControllerTestBase::cleanup()
0067 {
0068     Core::self()->languageControllerInternal()->cleanup();
0069 }
0070 
0071 void LanguageControllerTestBase::cleanupTestCase()
0072 {
0073     TestCore::shutdown();
0074 }
0075 
0076 void LanguageControllerTestBase::fillLanguageControllerMimeTypeCache() const
0077 {
0078     for (const auto& url : m_differentLanguagesUrls) {
0079         const auto languages = m_subject->languagesForUrl(url.url);
0080         QCOMPARE(languages.size(), 1);
0081         QCOMPARE(languages.back()->name(), url.languageName);
0082     }
0083 }
0084 
0085 void LanguageControllerTestBase::matchingLanguagesForUrlInBackgroundThreadTestData() const
0086 {
0087     QTest::addColumn<QUrl>("url");
0088     QTest::addColumn<QString>("languageName");
0089 
0090     QTest::newRow("CMakeLists") << testUrl("CMakeLists.txt") << "CMake";
0091     QTest::newRow("cmakelists wrong case") << testUrl("cmakelists.TXT") << "CMake";
0092 
0093     QTest::newRow("lower-case") << testUrl("x.cpp") << "clang";
0094     QTest::newRow("upper-case") << testUrl("Y.CPP") << "clang";
0095     QTest::newRow("mixed-case") << testUrl("aBc.CpP") << "clang";
0096 
0097     QTest::newRow(".C") << testUrl("ambiguous.C") << "clang";
0098     QTest::newRow(".cl") << testUrl("Open.cl") << "clang";
0099 
0100     QTest::newRow("existent C with extension") << existentTestUrl("t.c") << "clang";
0101 
0102     for (const auto& url : m_differentLanguagesUrls) {
0103         const auto filename = url.url.fileName();
0104         const auto extension = filename.mid(filename.lastIndexOf('.'));
0105         QTest::newRow(extension.toUtf8().constData()) << url.url << url.languageName;
0106     }
0107 }
0108 
0109 void LanguageControllerTestBase::matchingLanguagesForUrlTestData() const
0110 {
0111     matchingLanguagesForUrlInBackgroundThreadTestData();
0112 
0113     QTest::newRow("existent C w/o extension") << existentTestUrl("X") << "clang";
0114     QTest::newRow("existent patch w/o extension") << existentTestUrl("y") << "diff";
0115 }
0116 
0117 void LanguageControllerTestBase::nonmatchingLanguagesForUrlTestData()
0118 {
0119     QTest::addColumn<QUrl>("url");
0120 
0121     QTest::newRow("empty") << testUrl(QString());
0122     QTest::newRow("archive") << testUrl("a.tar.gz");
0123     QTest::newRow("OpenDocument Text") << testUrl("b.odt");
0124     QTest::newRow("existent archive with extension") << existentTestUrl("N.tar.gz");
0125     QTest::newRow("existent archive w/o extension") << existentTestUrl("z");
0126 }
0127 
0128 #include "moc_languagecontrollertestbase.cpp"