1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
/* SPDX-License-Identifier: GPL-3.0-or-later
* Copyright ยฉ 2021 by The qTox Project Contributors
* Copyright ยฉ 2024-2025 The TokTok team.
*/
#include "src/persistence/smileypack.h"
#include "src/persistence/ismileysettings.h"
#include "util/interface.h"
#include <QGuiApplication>
#include <QSignalSpy>
#include <QStandardPaths>
#include <QString>
#include <QtTest/QtTest>
#include <memory>
class MockSettings : public QObject, public ISmileySettings
{
Q_OBJECT
public:
QString getSmileyPack() const override;
SIGNAL_IMPL(MockSettings, smileyPackChanged, const QString& name)
};
QString MockSettings::getSmileyPack() const
{
return ":/smileys/EmojiOne/emoticons.xml";
}
class TestSmileyPack : public QObject
{
Q_OBJECT
private slots:
void testSmilifySingleCharEmoji();
void testSmilifyMultiCharEmoji();
void testSmilifyAsciiEmoticon();
private:
std::unique_ptr<QGuiApplication> app;
std::unique_ptr<MockSettings> settings = std::make_unique<MockSettings>();
};
/**
* @brief Test that single-character emojis (non-ascii) are correctly smileyfied
*/
void TestSmileyPack::testSmilifySingleCharEmoji()
{
SmileyPack smileyPack{*settings};
auto result = smileyPack.smileyfied("๐");
QVERIFY(result == SmileyPack::getAsRichText("๐"));
result = smileyPack.smileyfied("Some๐Letters");
QVERIFY(result == "Some" + SmileyPack::getAsRichText("๐") + "Letters");
}
/**
* @brief Test that multi-character emojis (non-ascii) are correctly smileyfied
* and not incorrectly matched against single-char counterparts
*/
void TestSmileyPack::testSmilifyMultiCharEmoji()
{
SmileyPack smileyPack{*settings};
auto result = smileyPack.smileyfied("๐ฌ๐ง");
QVERIFY(result == SmileyPack::getAsRichText("๐ฌ๐ง"));
result = smileyPack.smileyfied("Some๐ฌ๐งLetters");
QVERIFY(result == "Some" + SmileyPack::getAsRichText("๐ฌ๐ง") + "Letters");
// This verifies that multi-char emojis are not accidentally
// considered a multichar ascii smiley
result = smileyPack.smileyfied("๐ซ๐ท๐ฌ๐ง");
QVERIFY(result == SmileyPack::getAsRichText("๐ซ๐ท") + SmileyPack::getAsRichText("๐ฌ๐ง"));
}
/**
* @brief Test that single character emojis (non-ascii) are correctly smileyfied
* and not when surrounded by non-punctuation and non-whitespace chars
*/
void TestSmileyPack::testSmilifyAsciiEmoticon()
{
SmileyPack smileyPack{*settings};
auto result = smileyPack.smileyfied(":-)");
QVERIFY(result == SmileyPack::getAsRichText(":-)"));
const auto testMsg = QStringLiteral("Some:-)Letters");
result = smileyPack.smileyfied(testMsg);
// Nothing has changed. Ascii smileys are only considered
// when they are surrounded by white space
QVERIFY(result == testMsg);
result = smileyPack.smileyfied(" :-) ");
QVERIFY(result == " " + SmileyPack::getAsRichText(":-)") + " ");
}
QTEST_MAIN(TestSmileyPack)
#include "smileypack_test.moc"
|