File indexing completed on 2024-12-01 04:35:24

0001 /*
0002    SPDX-FileCopyrightText: 2018-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "inputtextmanagertest.h"
0008 #include "inputtextmanager.h"
0009 #include "model/inputcompletermodel.h"
0010 #include "rocketchataccount.h"
0011 #include <QSignalSpy>
0012 #include <QTest>
0013 QTEST_GUILESS_MAIN(InputTextManagerTest)
0014 
0015 InputTextManagerTest::InputTextManagerTest(QObject *parent)
0016     : QObject(parent)
0017 {
0018 }
0019 
0020 void InputTextManagerTest::shouldHaveDefaultValue()
0021 {
0022     InputTextManager manager(nullptr, nullptr);
0023     QVERIFY(manager.inputCompleterModel());
0024     QCOMPARE(manager.inputCompleterModel()->rowCount(), 0);
0025 }
0026 
0027 void InputTextManagerTest::shouldReplaceWord_data()
0028 {
0029     QTest::addColumn<QString>("newword");
0030     QTest::addColumn<QString>("text");
0031     QTest::addColumn<int>("position");
0032     QTest::addColumn<QString>("result");
0033     QTest::addColumn<int>("expectedPosition");
0034     QTest::newRow("empty") << QString() << QString() << 5 << QString() << 5;
0035     QTest::newRow("replace1") << QStringLiteral("bla") << QStringLiteral("foo @d") << 5 << QStringLiteral("foo @bla") << 8;
0036     QTest::newRow("replace2") << QStringLiteral("bla") << QStringLiteral("foo @daaaa") << 5 << QStringLiteral("foo @bla") << 8;
0037     QTest::newRow("replace3") << QStringLiteral("bla") << QStringLiteral("@daaaa foo") << 1 << QStringLiteral("@bla foo") << 4;
0038     QTest::newRow("buildbot") << QStringLiteral("buildbot ") << QStringLiteral("@bu") << 3 << QStringLiteral("@buildbot ") << 10;
0039     QTest::newRow("trailing_space_already_there") << QStringLiteral("bla ") << QStringLiteral("@daaaa foo") << 1 << QStringLiteral("@bla foo") << 5;
0040 }
0041 
0042 void InputTextManagerTest::shouldReplaceWord()
0043 {
0044     QFETCH(QString, newword);
0045     QFETCH(QString, text);
0046     QFETCH(int, position);
0047     QFETCH(int, expectedPosition);
0048     QFETCH(QString, result);
0049 
0050     InputTextManager manager(nullptr, nullptr);
0051 
0052     // Widgets
0053     QCOMPARE(manager.applyCompletion(newword, text, &position), result);
0054     QCOMPARE(position, expectedPosition);
0055 }
0056 
0057 void InputTextManagerTest::shouldSearchWord_data()
0058 {
0059     QTest::addColumn<QString>("text");
0060     QTest::addColumn<int>("position");
0061     QTest::addColumn<QString>("result");
0062     QTest::newRow("empty") << QString() << 5 << QString();
0063     QTest::newRow("one_letter") << QStringLiteral("l") << 1 << QStringLiteral("l");
0064     QTest::newRow("at") << QStringLiteral("@") << 1 << QStringLiteral("@");
0065     QTest::newRow("at_letter_1") << QStringLiteral("@a") << 1 << QStringLiteral("@a");
0066     QTest::newRow("at_letter") << QStringLiteral("@a") << 2 << QStringLiteral("@a");
0067     QTest::newRow("at_word_space") << QStringLiteral("@abc ") << 5 << QString();
0068 }
0069 
0070 void InputTextManagerTest::shouldSearchWord()
0071 {
0072     QFETCH(QString, text);
0073     QFETCH(int, position);
0074     QFETCH(QString, result);
0075 
0076     InputTextManager manager(nullptr, nullptr);
0077     int start; // TODO test the output value
0078     QCOMPARE(manager.searchWord(text, position, start), result);
0079 }
0080 
0081 void InputTextManagerTest::shouldEmitCompletionRequestSignals()
0082 {
0083     RocketChatAccount account;
0084     InputTextManager manager(&account, nullptr);
0085     QSignalSpy typeChangedSpy(&manager, &InputTextManager::completionTypeChanged);
0086     QSignalSpy requestSpy(&manager, &InputTextManager::completionRequested);
0087 
0088     manager.setInputTextChanged(QString(), QStringLiteral("a @"), 3);
0089     QCOMPARE(typeChangedSpy.count(), 1);
0090     QCOMPARE(typeChangedSpy.at(0).at(0).value<InputTextManager::CompletionForType>(), InputTextManager::User);
0091     QCOMPARE(requestSpy.count(), 0); // We don't send signal when we have only "@" now.
0092     typeChangedSpy.clear();
0093     requestSpy.clear();
0094 
0095     manager.setInputTextChanged(QString(), QStringLiteral("a :"), 3);
0096     QCOMPARE(typeChangedSpy.count(), 1);
0097     QCOMPARE(typeChangedSpy.at(0).at(0).value<InputTextManager::CompletionForType>(), InputTextManager::Emoji);
0098     typeChangedSpy.clear();
0099     QCOMPARE(requestSpy.count(), 0); // emoji completion doesn't use this signal
0100     requestSpy.clear();
0101 
0102     manager.setInputTextChanged(QString(), QStringLiteral("a "), 2);
0103     QCOMPARE(typeChangedSpy.count(), 1);
0104     QCOMPARE(typeChangedSpy.at(0).at(0).value<InputTextManager::CompletionForType>(), InputTextManager::None);
0105     typeChangedSpy.clear();
0106 
0107     manager.setInputTextChanged(QString(), QStringLiteral("a #c"), 4);
0108     QCOMPARE(typeChangedSpy.count(), 1);
0109     QCOMPARE(typeChangedSpy.at(0).at(0).value<InputTextManager::CompletionForType>(), InputTextManager::Channel);
0110     QCOMPARE(requestSpy.count(), 1);
0111     QCOMPARE(requestSpy.at(0).at(0).toString(), QStringLiteral("c"));
0112     typeChangedSpy.clear();
0113     requestSpy.clear();
0114 
0115     manager.setInputTextChanged(QString(), QStringLiteral("hello @foo"), 10);
0116     QCOMPARE(typeChangedSpy.count(), 1);
0117     QCOMPARE(typeChangedSpy.at(0).at(0).value<InputTextManager::CompletionForType>(), InputTextManager::User);
0118     QCOMPARE(requestSpy.count(), 1);
0119     QCOMPARE(requestSpy.at(0).at(0).toString(), QStringLiteral("foo"));
0120     requestSpy.clear();
0121     typeChangedSpy.clear();
0122 
0123     manager.setInputTextChanged(QString(), QStringLiteral("@foo hello"), 4);
0124     QCOMPARE(typeChangedSpy.count(), 0); // User again
0125     QCOMPARE(requestSpy.count(), 1);
0126     QCOMPARE(requestSpy.at(0).at(0).toString(), QStringLiteral("foo"));
0127     requestSpy.clear();
0128     typeChangedSpy.clear();
0129 
0130     manager.setInputTextChanged(QString(), QStringLiteral("a :heart:"), 9);
0131     QCOMPARE(typeChangedSpy.count(), 1);
0132     QCOMPARE(typeChangedSpy.at(0).at(0).value<InputTextManager::CompletionForType>(), InputTextManager::Emoji);
0133     QCOMPARE(requestSpy.count(), 0);
0134     typeChangedSpy.clear();
0135 
0136     // If the cursor isn't at the end of the word, don't trigger completion
0137     manager.setInputTextChanged(QString(), QStringLiteral("@foo"), 2);
0138     QCOMPARE(typeChangedSpy.count(), 1);
0139     QCOMPARE(typeChangedSpy.at(0).at(0).value<InputTextManager::CompletionForType>(), InputTextManager::None);
0140     QCOMPARE(requestSpy.count(), 0);
0141     typeChangedSpy.clear();
0142 }
0143 
0144 #include "moc_inputtextmanagertest.cpp"