diff --git a/src/plugins/texteditor/CMakeLists.txt b/src/plugins/texteditor/CMakeLists.txt index eebe8bf0bed..048cd40b1d5 100644 --- a/src/plugins/texteditor/CMakeLists.txt +++ b/src/plugins/texteditor/CMakeLists.txt @@ -113,5 +113,7 @@ add_qtc_plugin(TextEditor extend_qtc_plugin(TextEditor CONDITION WITH_TESTS - SOURCES texteditor_test.cpp + SOURCES + codeassist/codeassist_test.cpp codeassist/codeassist_test.h + texteditor_test.cpp ) diff --git a/src/plugins/texteditor/codeassist/codeassist_test.cpp b/src/plugins/texteditor/codeassist/codeassist_test.cpp new file mode 100644 index 00000000000..8b724dbe166 --- /dev/null +++ b/src/plugins/texteditor/codeassist/codeassist_test.cpp @@ -0,0 +1,152 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#ifdef WITH_TESTS + +#include "codeassist_test.h" + +#include "../texteditor.h" + +#include "assistinterface.h" +#include "assistproposaliteminterface.h" +#include "asyncprocessor.h" +#include "completionassistprovider.h" +#include "genericproposal.h" +#include "genericproposalwidget.h" + +#include +#include +#include + +#include + +namespace TextEditor::Internal { + +class TestProposalItem : public AssistProposalItemInterface +{ +public: + QString m_text = "test"; + bool m_implicitlyApplies = false; + bool m_prematurelyApplies = false; + QIcon m_icon; + QString m_detail = "detail"; + bool m_isSnippet = false; + bool m_isValid = true; + + QString text() const override { return m_text; } + bool implicitlyApplies() const override { return m_implicitlyApplies; } + bool prematurelyApplies(const QChar &) const override { return m_prematurelyApplies; } + QIcon icon() const override { return m_icon; } + QString detail() const override { return m_detail; } + bool isSnippet() const override { return m_isSnippet; } + bool isValid() const override { return m_isValid; } + quint64 hash() const override { return 0; } // used to remove duplicates +}; + +class OpenEditorItem : public TestProposalItem +{ +public: + void apply(TextDocumentManipulatorInterface &, int) const override + { + m_openedEditor = Core::EditorManager::openEditor(m_filePath, + Core::Constants::K_DEFAULT_TEXT_EDITOR_ID); + } + + mutable Core::IEditor *m_openedEditor = nullptr; + Utils::FilePath m_filePath; +}; + +class TestProposalWidget : public GenericProposalWidget +{ +public: + void showProposal(const QString &prefix) override + { + GenericProposalModelPtr proposalModel = model(); + if (proposalModel && proposalModel->size() == 1) { + emit proposalItemActivated(proposalModel->proposalItem(0)); + deleteLater(); + return; + } + GenericProposalWidget::showProposal(prefix); + } +}; + +class TestProposal : public GenericProposal +{ +public: + TestProposal(int pos, const QList &items) + : GenericProposal(pos, items) + {} + IAssistProposalWidget *createWidget() const override { return new TestProposalWidget; } +}; + +class TestProcessor : public AsyncProcessor +{ +public: + TestProcessor(const QList &items) + : m_items(items) + {} + IAssistProposal *performAsync() override + { return new TestProposal(interface()->position(), m_items); } + QList m_items; +}; + +class TestProvider : public CompletionAssistProvider +{ +public: + IAssistProcessor *createProcessor(const AssistInterface *assistInterface) const override + { + Q_UNUSED(assistInterface); + return new TestProcessor(m_items); + } + QList m_items; +}; + +void CodeAssistTests::initTestCase() +{ + Core::IEditor *editor = Core::EditorManager::openEditorWithContents( + Core::Constants::K_DEFAULT_TEXT_EDITOR_ID); + QVERIFY(editor); + m_editor = qobject_cast(editor); + QVERIFY(m_editor); + m_editorsToClose << m_editor; + m_testProvider = new TestProvider(); +} + +static Utils::FilePath createBigFile() +{ + constexpr int textChunkSize = 65536; // from utils/textfileformat.cpp + + const Utils::FilePath result = Utils::TemporaryDirectory::masterDirectoryFilePath() / "BigFile"; + QByteArray data; + data.reserve(textChunkSize); + while (data.size() < textChunkSize) + data.append("bigfile line\n"); + result.writeFileContents(data); + return result; +} + +void CodeAssistTests::testFollowSymbolBigFile() +{ + auto item = new OpenEditorItem; + item->m_filePath = createBigFile(); + m_testProvider->m_items = {item}; + auto editorWidget = m_editor->editorWidget(); + + editorWidget->invokeAssist(FollowSymbol, m_testProvider); + QSignalSpy spy(editorWidget, &TextEditorWidget::assistFinished); + QVERIFY(spy.wait(1000)); + QVERIFY(item->m_openedEditor); + m_editorsToClose << item->m_openedEditor; +} + +void CodeAssistTests::cleanupTestCase() +{ + m_testProvider->m_items.clear(); + Core::EditorManager::closeEditors(m_editorsToClose); + QVERIFY(Core::EditorManager::currentEditor() == nullptr); +} + +} // namespace TextEditor::Internal + +#endif // ifdef WITH_TESTS diff --git a/src/plugins/texteditor/codeassist/codeassist_test.h b/src/plugins/texteditor/codeassist/codeassist_test.h new file mode 100644 index 00000000000..3bf734aadfb --- /dev/null +++ b/src/plugins/texteditor/codeassist/codeassist_test.h @@ -0,0 +1,37 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 + +#pragma once + +#ifdef WITH_TESTS + +#include + +namespace Core { class IEditor; } +namespace TextEditor { class BaseTextEditor; } + +namespace TextEditor::Internal { + +class TestProvider; + +class CodeAssistTests : public QObject +{ + Q_OBJECT +public: + +private slots: + void initTestCase(); + + void testFollowSymbolBigFile(); + + void cleanupTestCase(); + +private: + TextEditor::BaseTextEditor *m_editor = nullptr; + QList m_editorsToClose; + TestProvider *m_testProvider = nullptr; +}; + +} // namespace TextEditor::Internal + +#endif diff --git a/src/plugins/texteditor/texteditor.qbs b/src/plugins/texteditor/texteditor.qbs index 1b94811a563..071e0b5fc2a 100644 --- a/src/plugins/texteditor/texteditor.qbs +++ b/src/plugins/texteditor/texteditor.qbs @@ -224,6 +224,8 @@ Project { QtcTestFiles { files: [ + "codeassist/codeassist_test.cpp", + "codeassist/codeassist_test.h", "texteditor_test.cpp", ] } diff --git a/src/plugins/texteditor/texteditor_test.cpp b/src/plugins/texteditor/texteditor_test.cpp index e939e515681..3b88ac5efb5 100644 --- a/src/plugins/texteditor/texteditor_test.cpp +++ b/src/plugins/texteditor/texteditor_test.cpp @@ -3,20 +3,13 @@ #ifdef WITH_TESTS -#include -#include -#include +#include "tabsettings.h" +#include "texteditorplugin.h" + +#include #include -#include -#include - -#include "texteditor.h" -#include "texteditorplugin.h" -#include "textdocument.h" -#include "tabsettings.h" - -using namespace TextEditor; +namespace TextEditor { QString tabPolicyToString(TabSettings::TabPolicy policy) { @@ -149,4 +142,6 @@ void Internal::TextEditorPlugin::testIndentationClean() QCOMPARE(settings.isIndentationClean(block, indentSize), clean); } +} // namespace TextEditor + #endif // ifdef WITH_TESTS diff --git a/src/plugins/texteditor/texteditorplugin.cpp b/src/plugins/texteditor/texteditorplugin.cpp index a66ddf23c32..4d5c2268d1e 100644 --- a/src/plugins/texteditor/texteditorplugin.cpp +++ b/src/plugins/texteditor/texteditorplugin.cpp @@ -20,6 +20,10 @@ #include "texteditorsettings.h" #include "texteditortr.h" +#ifdef WITH_TESTS +#include "codeassist/codeassist_test.h" +#endif + #include #include #include @@ -142,6 +146,10 @@ void TextEditorPlugin::initialize() Tr::tr("Text", "SnippetProvider")); d->createStandardContextMenu(); + +#ifdef WITH_TESTS + addTest(); +#endif } void TextEditorPluginPrivate::extensionsInitialized()