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

0001 /*
0002     SPDX-FileCopyrightText: 2016 Milian Wolff <mail@milianw.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "bench_codecompletion.h"
0008 
0009 #include <QTest>
0010 #include <QSignalSpy>
0011 
0012 #include <KTextEditor/Cursor>
0013 
0014 #include <tests/testfile.h>
0015 
0016 #include <language/duchain/duchainlock.h>
0017 
0018 #include "duchain/parsesession.h"
0019 #include "duchain/clangindex.h"
0020 
0021 #include "codecompletion/model.h"
0022 
0023 QTEST_MAIN(BenchCodeCompletion)
0024 
0025 using namespace KDevelop;
0026 
0027 BenchCodeCompletion::BenchCodeCompletion()
0028     : m_index(new ClangIndex)
0029     , m_model(new ClangCodeCompletionModel(m_index.data(), this))
0030 {
0031     m_model->initialize();
0032 }
0033 
0034 BenchCodeCompletion::~BenchCodeCompletion() = default;
0035 
0036 void BenchCodeCompletion::benchCodeCompletion_data()
0037 {
0038     QTest::addColumn<QString>("code");
0039     QTest::addColumn<KTextEditor::Cursor>("position");
0040 
0041     QTest::newRow("empty") << "" << KTextEditor::Cursor(0, 0);
0042 
0043     QTest::newRow("stl") << R"(
0044     #include <vector>
0045     #include <unordered_map>
0046     #include <unordered_set>
0047 
0048     int main()
0049     {
0050         return 0;
0051     }
0052     )" << KTextEditor::Cursor(7, 0);
0053 
0054     QTest::newRow("clib") << R"(
0055     #include <cstring>
0056     #include <cstdio>
0057     #include <cmath>
0058 
0059     int main()
0060     {
0061         return 0;
0062     }
0063     )" << KTextEditor::Cursor(7, 0);
0064 }
0065 
0066 void BenchCodeCompletion::benchCodeCompletion()
0067 {
0068     QFETCH(QString, code);
0069     QFETCH(KTextEditor::Cursor, position);
0070 
0071     TestFile file(code, "cpp");
0072     QVERIFY(file.parseAndWait(TopDUContext::AllDeclarationsContextsUsesAndAST, 1, 5000));
0073 
0074     auto view = createView(file.url().toUrl());
0075 
0076     QSignalSpy spy(m_model, &QAbstractItemModel::modelReset);
0077     QBENCHMARK {
0078         m_model->completionInvoked(view.get(), {position, position}, KTextEditor::CodeCompletionModel::UserInvocation);
0079         do {
0080             spy.wait();
0081         } while (!m_model->rowCount());
0082     }
0083 }
0084 
0085 #include "moc_bench_codecompletion.cpp"