[kdevelop/kdevelop] plugins/clang/tests: Add navigation context test for virtual details
Yin Zhijie <[email protected]>
| Newsgroups | gmane.comp.kde.cvs |
|---|---|
| Message-ID | <[email protected]> |
Git commit b5f748d7ca396a9bea68953268ad2d88fb147a7f by Yin Zhijie.
Committed on 27/07/2026 at 10:12.
Pushed by bednar into branch 'master'.
Add navigation context test for virtual details
M +8 -0 plugins/clang/tests/CMakeLists.txt
A +98 -0 plugins/clang/tests/test_navigationcontext.cpp [License: GPL(3+eV) GPL(v3.0) GPL(v2.0)]
A +23 -0 plugins/clang/tests/test_navigationcontext.h [License: GPL(3+eV) GPL(v3.0) GPL(v2.0)]
https://invent.kde.org/kdevelop/kdevelop/-/commit/b5f748d7ca396a9bea68953268ad2d88fb147a7f
diff --git a/plugins/clang/tests/CMakeLists.txt b/plugins/clang/tests/CMakeLists.txt
index e20d9038c8..f6956a8b11 100644
--- a/plugins/clang/tests/CMakeLists.txt
+++ b/plugins/clang/tests/CMakeLists.txt
@@ -72,6 +72,14 @@ ecm_add_test(test_duchain.cpp
KDev::DefinesAndIncludesManager
)
+ecm_add_test(test_navigationcontext.cpp
+ TEST_NAME test_navigationcontext
+ LINK_LIBRARIES
+ KDev::Tests
+ Qt::Test
+ KDevClangPrivate
+)
+
ecm_add_test(test_refactoring.cpp
TEST_NAME test_refactoring-clang
LINK_LIBRARIES
diff --git a/plugins/clang/tests/test_navigationcontext.cpp b/plugins/clang/tests/test_navigationcontext.cpp
new file mode 100644
index 0000000000..36fd808b2c
--- /dev/null
+++ b/plugins/clang/tests/test_navigationcontext.cpp
@@ -0,0 +1,98 @@
+/*
+ SPDX-FileCopyrightText: 2026 Yin Zhijie <[email protected]>
+
+ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
+*/
+
+#include "test_navigationcontext.h"
+
+#include <language/duchain/duchainlock.h>
+#include <language/duchain/navigation/abstractdeclarationnavigationcontext.h>
+#include <language/duchain/problem.h>
+#include <tests/autotestshell.h>
+#include <tests/testcore.h>
+#include <tests/testfile.h>
+
+#include <QLoggingCategory>
+#include <QTest>
+
+using namespace KDevelop;
+
+namespace {
+class TestDeclarationNavigationContext : public AbstractDeclarationNavigationContext
+{
+public:
+ using AbstractDeclarationNavigationContext::AbstractDeclarationNavigationContext;
+ using AbstractDeclarationNavigationContext::declarationDetails;
+};
+}
+
+QTEST_GUILESS_MAIN(TestNavigationContext)
+
+void TestNavigationContext::initTestCase()
+{
+ QLoggingCategory::setFilterRules(
+ QStringLiteral("*.debug=false\ndefault.debug=true\nkdevelop.plugins.clang.debug=true\n"));
+ QVERIFY(qputenv("KDEV_CLANG_DISPLAY_DIAGS", "1"));
+ AutoTestShell::init({QStringLiteral("kdevclangsupport")});
+ TestCore::initialize(Core::NoUi);
+}
+
+void TestNavigationContext::cleanupTestCase()
+{
+ TestCore::shutdown();
+}
+
+void TestNavigationContext::testDeclarationDetailsVirtualFinalAbstract()
+{
+ TestFile file(QStringLiteral(R"(
+ class Base {
+ public:
+ virtual bool isAbstract() = 0;
+ virtual bool onlyVirtual();
+ };
+
+ class Derived : public Base {
+ virtual ~Derived();
+ virtual bool isFinal() final;
+ };
+ )"),
+ QStringLiteral("cpp"));
+ file.parse(TopDUContext::AllDeclarationsContextsAndUses);
+ QVERIFY(file.waitForParsed(1000));
+ {
+ DUChainReadLocker lock;
+ const auto top = file.topContext();
+ QVERIFY(top);
+ QVERIFY(top->problems().isEmpty());
+
+ const auto onlyVirtualDecls = top->findDeclarations(QualifiedIdentifier(u"Base::onlyVirtual"));
+ QCOMPARE(onlyVirtualDecls.size(), 1);
+ const DeclarationPointer onlyVirtualDecl(onlyVirtualDecls.first());
+
+ const auto isAbstractDecls = top->findDeclarations(QualifiedIdentifier(u"Base::isAbstract"));
+ QCOMPARE(isAbstractDecls.size(), 1);
+ const DeclarationPointer isAbstractDecl(isAbstractDecls.first());
+
+ const auto isFinalDecls = top->findDeclarations(QualifiedIdentifier(u"Derived::isFinal"));
+ QCOMPARE(isFinalDecls.size(), 1);
+ const DeclarationPointer isFinalDecl(isFinalDecls.first());
+
+ const QStringList onlyVirtualDetails = TestDeclarationNavigationContext::declarationDetails(onlyVirtualDecl);
+ QVERIFY(onlyVirtualDetails.contains(QStringLiteral("virtual")));
+ QVERIFY(!onlyVirtualDetails.contains(QStringLiteral("abstract")));
+ QVERIFY(!onlyVirtualDetails.contains(QStringLiteral("final")));
+
+ const QStringList isAbstractDetails = TestDeclarationNavigationContext::declarationDetails(isAbstractDecl);
+ QVERIFY(isAbstractDetails.contains(QStringLiteral("abstract")));
+ QVERIFY(!isAbstractDetails.contains(QStringLiteral("virtual")));
+ QVERIFY(!isAbstractDetails.contains(QStringLiteral("final")));
+
+ const QStringList isFinalDetails = TestDeclarationNavigationContext::declarationDetails(isFinalDecl);
+ QVERIFY(isFinalDetails.contains(QStringLiteral("final")));
+ QVERIFY(!isFinalDetails.contains(QStringLiteral("virtual")));
+ QVERIFY(!isFinalDetails.contains(QStringLiteral("abstract")));
+ }
+}
+
+#include "moc_test_navigationcontext.cpp"
diff --git a/plugins/clang/tests/test_navigationcontext.h b/plugins/clang/tests/test_navigationcontext.h
new file mode 100644
index 0000000000..3e4db5a86a
--- /dev/null
+++ b/plugins/clang/tests/test_navigationcontext.h
@@ -0,0 +1,23 @@
+/*
+ SPDX-FileCopyrightText: 2026 Yin Zhijie <[email protected]>
+
+ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
+*/
+
+#ifndef TESTNAVIGATIONCONTEXT_H
+#define TESTNAVIGATIONCONTEXT_H
+
+#include <QObject>
+
+class TestNavigationContext : public QObject
+{
+ Q_OBJECT
+
+private Q_SLOTS:
+ void initTestCase();
+ void cleanupTestCase();
+
+ void testDeclarationDetailsVirtualFinalAbstract();
+};
+
+#endif // TESTNAVIGATIONCONTEXT_H