File indexing completed on 2024-09-29 12:10:24

0001 /*
0002     This file is part of the KDE project
0003     SPDX-FileCopyrightText: 2005 Hamish Rodda <rodda@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "codecompletiontestmodel.h"
0009 
0010 #include <kateglobal.h>
0011 #include <katewordcompletion.h>
0012 #include <ktexteditor/codecompletioninterface.h>
0013 #include <ktexteditor/document.h>
0014 #include <ktexteditor/view.h>
0015 
0016 CodeCompletionTestModel::CodeCompletionTestModel(KTextEditor::View *parent, const QString &startText)
0017     : KTextEditor::CodeCompletionModel(parent)
0018     , m_startText(startText)
0019     , m_autoStartText(m_startText.isEmpty())
0020 {
0021     setRowCount(40);
0022 
0023     Q_ASSERT(cc());
0024 
0025     cc()->setAutomaticInvocationEnabled(true);
0026     cc()->unregisterCompletionModel(KTextEditor::EditorPrivate::self()->wordCompletionModel()); // would add additional items, we don't want that in tests
0027     cc()->registerCompletionModel(this);
0028 }
0029 
0030 // Fake a series of completions
0031 QVariant CodeCompletionTestModel::data(const QModelIndex &index, int role) const
0032 {
0033     switch (role) {
0034     case Qt::DisplayRole:
0035         if (index.row() < rowCount() / 2) {
0036             switch (index.column()) {
0037             case Prefix:
0038                 switch (index.row() % 3) {
0039                 default:
0040                     return "void ";
0041                 case 1:
0042                     return "const QString& ";
0043                 case 2:
0044                     if (index.row() % 6) {
0045                         return "inline virtual bool ";
0046                     }
0047                     return "virtual bool ";
0048                 }
0049 
0050             case Scope:
0051                 switch (index.row() % 4) {
0052                 default:
0053                     return QString();
0054                 case 1:
0055                     return "KTextEditor::";
0056                 case 2:
0057                     return "::";
0058                 case 3:
0059                     return "std::";
0060                 }
0061 
0062             case Name:
0063                 return QString(m_startText + QString("%1%2%3").arg(QChar('a' + (index.row() % 3))).arg(QChar('a' + index.row())).arg(index.row()));
0064 
0065             case Arguments:
0066                 switch (index.row() % 5) {
0067                 default:
0068                     return "()";
0069                 case 1:
0070                     return "(bool trigger)";
0071                 case 4:
0072                     return "(const QString& name, Qt::CaseSensitivity cs)";
0073                 case 5:
0074                     return "(int count)";
0075                 }
0076 
0077             case Postfix:
0078                 switch (index.row() % 3) {
0079                 default:
0080                     return " const";
0081                 case 1:
0082                     return " KDE_DEPRECATED";
0083                 case 2:
0084                     return "";
0085                 }
0086             }
0087         } else {
0088             switch (index.column()) {
0089             case Prefix:
0090                 switch (index.row() % 3) {
0091                 default:
0092                     return "void ";
0093                 case 1:
0094                     return "const QString ";
0095                 case 2:
0096                     return "bool ";
0097                 }
0098 
0099             case Scope:
0100                 switch (index.row() % 4) {
0101                 default:
0102                     return QString();
0103                 case 1:
0104                     return "KTextEditor::";
0105                 case 2:
0106                     return "::";
0107                 case 3:
0108                     return "std::";
0109                 }
0110 
0111             case Name:
0112                 return QString(m_startText + QString("%1%2%3").arg(QChar('a' + (index.row() % 3))).arg(QChar('a' + index.row())).arg(index.row()));
0113 
0114             default:
0115                 return "";
0116             }
0117         }
0118         break;
0119 
0120     case Qt::DecorationRole:
0121         break;
0122 
0123     case CompletionRole: {
0124         CompletionProperties p;
0125         if (index.row() < rowCount() / 2) {
0126             p |= Function;
0127         } else {
0128             p |= Variable;
0129         }
0130         switch (index.row() % 3) {
0131         case 0:
0132             p |= Const | Public;
0133             break;
0134         case 1:
0135             p |= Protected;
0136             break;
0137         case 2:
0138             p |= Private;
0139             break;
0140         }
0141         return (int)p;
0142     }
0143 
0144     case ScopeIndex:
0145         return (index.row() % 4) - 1;
0146     }
0147 
0148     return QVariant();
0149 }
0150 
0151 KTextEditor::View *CodeCompletionTestModel::view() const
0152 {
0153     return static_cast<KTextEditor::View *>(const_cast<QObject *>(QObject::parent()));
0154 }
0155 
0156 KTextEditor::CodeCompletionInterface *CodeCompletionTestModel::cc() const
0157 {
0158     return dynamic_cast<KTextEditor::CodeCompletionInterface *>(const_cast<QObject *>(QObject::parent()));
0159 }
0160 
0161 void CodeCompletionTestModel::completionInvoked(KTextEditor::View *view, const KTextEditor::Range &range, InvocationType invocationType)
0162 {
0163     Q_UNUSED(invocationType)
0164 
0165     if (m_autoStartText) {
0166         m_startText = view->document()->text(KTextEditor::Range(range.start(), view->cursorPosition()));
0167     }
0168     qDebug() << m_startText;
0169 }
0170 
0171 AbbreviationCodeCompletionTestModel::AbbreviationCodeCompletionTestModel(KTextEditor::View *parent, const QString &startText)
0172     : CodeCompletionTestModel(parent, startText)
0173 {
0174     m_items << "SomeCoolAbbreviation"
0175             << "someCoolAbbreviation"
0176             << "sca"
0177             << "SCA";
0178     m_items << "some_cool_abbreviation"
0179             << "Some_Cool_Abbreviation";
0180     m_items << "thisContainsSomeWord"
0181             << "this_contains_some_word"
0182             << "thiscontainssomeword";
0183     m_items << "notmatchedbecausemissingcaps"
0184             << "not_m_atch_ed_because_underscores";
0185     setRowCount(m_items.size());
0186 }
0187 
0188 QVariant AbbreviationCodeCompletionTestModel::data(const QModelIndex &index, int role) const
0189 {
0190     if (index.column() == Name && role == Qt::DisplayRole) {
0191         return m_items[index.row()];
0192     }
0193     return QVariant();
0194 }
0195 
0196 AsyncCodeCompletionTestModel::AsyncCodeCompletionTestModel(KTextEditor::View *parent, const QString &startText)
0197     : CodeCompletionTestModel(parent, startText)
0198 {
0199     setRowCount(0);
0200 }
0201 
0202 QVariant AsyncCodeCompletionTestModel::data(const QModelIndex &index, int role) const
0203 {
0204     if (index.column() == Name && role == Qt::DisplayRole) {
0205         return m_items[index.row()];
0206     }
0207     return QVariant();
0208 }
0209 
0210 void AsyncCodeCompletionTestModel::setItems(const QStringList &items)
0211 {
0212     beginResetModel();
0213     m_items = items;
0214     setRowCount(m_items.size());
0215     endResetModel();
0216 }
0217 
0218 void AsyncCodeCompletionTestModel::completionInvoked(KTextEditor::View *view, const KTextEditor::Range &range, InvocationType invocationType)
0219 {
0220     Q_UNUSED(invocationType)
0221 
0222     Q_EMIT waitForReset();
0223     CodeCompletionTestModel::completionInvoked(view, range, invocationType);
0224 }
0225 
0226 #include "moc_codecompletiontestmodel.cpp"