[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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.