File indexing completed on 2024-12-01 04:35:29
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 "textconvertertest.h" 0008 #include "emoticons/emojimanager.h" 0009 #include "messages/message.h" 0010 #include "ruqola_autotest_helper.h" 0011 #include "textconverter.h" 0012 #include "utils.h" 0013 #include <QJsonObject> 0014 #include <QRegularExpression> 0015 0016 #include <KColorScheme> 0017 0018 QTEST_GUILESS_MAIN(TextConverterTest) 0019 0020 namespace 0021 { 0022 QString prepareExpectedOutput(QString output) 0023 { 0024 KColorScheme scheme; 0025 const auto codeBackgroundColor = scheme.background(KColorScheme::AlternateBackground).color().name(); 0026 const auto codeBorderColor = scheme.foreground(KColorScheme::InactiveText).color().name(); 0027 0028 const auto userHighlightForegroundColor = scheme.foreground(KColorScheme::PositiveText).color().name(); 0029 const auto userHighlightBackgroundColor = scheme.background(KColorScheme::PositiveBackground).color().name(); 0030 0031 output.replace(QLatin1String("$BGCOLOR$"), codeBackgroundColor); 0032 output.replace(QLatin1String("$BORDERCOLOR$"), codeBorderColor); 0033 output.replace(QLatin1String("$USERCOLOR$"), userHighlightForegroundColor); 0034 output.replace(QLatin1String("$USERBGCOLOR$"), userHighlightBackgroundColor); 0035 0036 output.prepend(QLatin1String("<qt>")); 0037 output.append(QLatin1String("</qt>")); 0038 0039 return output; 0040 } 0041 } 0042 0043 TextConverterTest::TextConverterTest(QObject *parent) 0044 : QObject(parent) 0045 { 0046 } 0047 0048 void TextConverterTest::shouldConvertText_data() 0049 { 0050 QTest::addColumn<QString>("input"); 0051 QTest::addColumn<QString>("output"); 0052 QTest::newRow("empty") << QString() << QString(); 0053 QTest::newRow("simpletext") << QStringLiteral("foo") << QStringLiteral("<div>foo</div>"); 0054 QTest::newRow("customemojiwithoutmanager") << QStringLiteral(":foo:") << QStringLiteral("<div>:foo:</div>"); 0055 0056 QTest::newRow("testurl") << QStringLiteral("http://www.kde.org http://www.kde.org") 0057 << QStringLiteral( 0058 "<div><a href=\"http://www.kde.org\">http://www.kde.org</a> <a href=\"http://www.kde.org\">http://www.kde.org</a></div>"); 0059 QTest::newRow("named-url") << QStringLiteral("[example.com](http://example.com)") 0060 << QStringLiteral("<div><a href=\"http://example.com\">example.com</a></div>"); 0061 QTest::newRow("bold") << QStringLiteral("*bla*") << QStringLiteral("<div><b>bla</b></div>"); 0062 QTest::newRow("multi star") << QStringLiteral("**bla**") << QStringLiteral("<div><b>bla</b></div>"); 0063 QTest::newRow("multi star2") << QStringLiteral("***bla***") << QStringLiteral("<div>***bla***</div>"); 0064 QTest::newRow("multi star3") << QStringLiteral("***bla ******") << QStringLiteral("<div>***bla ******</div>"); 0065 QTest::newRow("Remove <br/>") << QStringLiteral("foo<br />") << QStringLiteral("<div>foo</div>"); 0066 0067 QTest::newRow("0.6.3") << QStringLiteral("0.6.3") << QStringLiteral("<div>0.6.3</div>"); 0068 // Bug 391520 0069 QTest::newRow("multi-line") << QStringLiteral("These are the options:\n- a\n- b") 0070 << QStringLiteral("<div>These are the options:<br />\n- a<br />\n- b</div>"); 0071 0072 QTest::newRow("word@") << QStringLiteral("@foo") << QStringLiteral("<div><a href='ruqola:/user/foo'>@foo</a></div>"); 0073 QTest::newRow("word@-2") << QStringLiteral("@foo.bla") << QStringLiteral("<div><a href='ruqola:/user/foo.bla'>@foo.bla</a></div>"); 0074 QTest::newRow("word@-3") << QStringLiteral("@foo.bla.bli") << QStringLiteral("<div><a href='ruqola:/user/foo.bla.bli'>@foo.bla.bli</a></div>"); 0075 QTest::newRow("word@-4") << QStringLiteral("@foo.bla.bli dd") << QStringLiteral("<div><a href='ruqola:/user/foo.bla.bli'>@foo.bla.bli</a> dd</div>"); 0076 QTest::newRow("word@-5") << QStringLiteral("bla bla 21 @foo.bla.bli dd") 0077 << QStringLiteral("<div>bla bla 21 <a href='ruqola:/user/foo.bla.bli'>@foo.bla.bli</a> dd</div>"); 0078 QTest::newRow("word@-6") << QStringLiteral("@foo-bla") << QStringLiteral("<div><a href='ruqola:/user/foo-bla'>@foo-bla</a></div>"); 0079 QTest::newRow("word@-7") << QStringLiteral("@foo_bla") << QStringLiteral("<div><a href='ruqola:/user/foo_bla'>@foo_bla</a></div>"); 0080 QTest::newRow("word@-8") << QStringLiteral("bli@foo_bla") << QStringLiteral("<div>bli@foo_bla</div>"); 0081 QTest::newRow("word@-9") << QStringLiteral("@réunion") << QStringLiteral("<div><a href='ruqola:/user/réunion'>@réunion</a></div>"); 0082 0083 QTest::newRow("word#") << QStringLiteral("#foo") << QStringLiteral("<div><a href='ruqola:/room/foo'>#foo</a></div>"); 0084 QTest::newRow("word#-2") << QStringLiteral("#foo.bla") << QStringLiteral("<div><a href='ruqola:/room/foo.bla'>#foo.bla</a></div>"); 0085 QTest::newRow("word#-3") << QStringLiteral("#foo.bla.bli") << QStringLiteral("<div><a href='ruqola:/room/foo.bla.bli'>#foo.bla.bli</a></div>"); 0086 QTest::newRow("word#-4") << QStringLiteral("#foo.bla.bli dd") << QStringLiteral("<div><a href='ruqola:/room/foo.bla.bli'>#foo.bla.bli</a> dd</div>"); 0087 QTest::newRow("word#-5") << QStringLiteral("bla bla 21 #foo.bla.bli dd") 0088 << QStringLiteral("<div>bla bla 21 <a href='ruqola:/room/foo.bla.bli'>#foo.bla.bli</a> dd</div>"); 0089 QTest::newRow("word#-6") << QStringLiteral("#foo-bla") << QStringLiteral("<div><a href='ruqola:/room/foo-bla'>#foo-bla</a></div>"); 0090 QTest::newRow("word#-7") << QStringLiteral("#foo_bla") << QStringLiteral("<div><a href='ruqola:/room/foo_bla'>#foo_bla</a></div>"); 0091 QTest::newRow("word#-8") << QStringLiteral("#réunion") << QStringLiteral("<div><a href='ruqola:/room/réunion'>#réunion</a></div>"); 0092 // Test parsing when it's in an url... don't replace it. 0093 0094 QTest::newRow("url") << QStringLiteral("http://www.kde.org#foo_bla") 0095 << QStringLiteral("<div><a href=\"http://www.kde.org#foo_bla\">http://www.kde.org#foo_bla</a></div>"); 0096 0097 QTest::newRow("0.6.3") << QStringLiteral("0.6.3") << QStringLiteral("<div>0.6.3</div>"); 0098 QTest::newRow("`code`") 0099 << QStringLiteral("foo `bla` bar `asdf` test") 0100 << QStringLiteral("<div>foo <code style='background-color:$BGCOLOR$'>bla</code> bar <code style='background-color:$BGCOLOR$'>asdf</code> test</div>"); 0101 QTest::newRow("`code \\` escaped`") << QStringLiteral("foo `bla\\` bar \\`asdf` test") 0102 << QStringLiteral("<div>foo <code style='background-color:$BGCOLOR$'>bla\\` bar \\`asdf</code> test</div>"); 0103 QTest::newRow("quote<") 0104 << QStringLiteral("`inside quotes: <<....` this is outside the quotes <<.") 0105 << QStringLiteral("<div><code style='background-color:$BGCOLOR$'>inside quotes: <<....</code> this is outside the quotes <<.</div>"); 0106 0107 QTest::newRow("quotedtext1") << QStringLiteral("> toto") << QStringLiteral("<div><code style='background-color:$BGCOLOR$'>toto</code></div>"); 0108 0109 QTest::newRow("quotedtext2") << QStringLiteral("bla \n> toto") 0110 << QStringLiteral("<div>bla <br />\n<code style='background-color:$BGCOLOR$'>toto</code></div>"); 0111 0112 QTest::newRow("quotedtext3") 0113 << QStringLiteral("bla \n> toto \n> bla") 0114 << QStringLiteral( 0115 "<div>bla <br />\n<code style='background-color:$BGCOLOR$'>toto</code><br /><code style='background-color:$BGCOLOR$'>bla</code></div>"); 0116 0117 QTest::newRow("quotedtext4") 0118 << QStringLiteral("bla \n> toto \n> *bla*") 0119 << QStringLiteral( 0120 "<div>bla <br />\n<code style='background-color:$BGCOLOR$'>toto</code><br /><code style='background-color:$BGCOLOR$'><b>bla</b></code></div>"); 0121 0122 QTest::newRow("noquotedtext") << QStringLiteral("bla > toto") << QStringLiteral("<div>bla > toto</div>"); 0123 } 0124 0125 void TextConverterTest::shouldConvertText() 0126 { 0127 QFETCH(QString, input); 0128 QFETCH(QString, output); 0129 0130 output = prepareExpectedOutput(output); 0131 0132 QEXPECT_FAIL("multi star", "Bug in KF5", Continue); 0133 QEXPECT_FAIL("Remove <br/>", "Bug in KF5", Continue); 0134 0135 QString needUpdateMessageId; 0136 const TextConverter::ConvertMessageTextSettings settings(input, QString(), {}, {}, nullptr, nullptr, {}, {}); 0137 int recursiveIndex = 0; 0138 QCOMPARE(TextConverter::convertMessageText(settings, needUpdateMessageId, recursiveIndex), 0139 output); // TODO add autotests for highlightwords 0140 } 0141 0142 void TextConverterTest::shouldHighlightWords_data() 0143 { 0144 QTest::addColumn<QString>("input"); 0145 QTest::addColumn<QString>("username"); 0146 QTest::addColumn<QStringList>("highlightWords"); 0147 QTest::addColumn<QString>("output"); 0148 QTest::newRow("empty") << QString() << QString() << QStringList{} << QString(); 0149 const QStringList highlightWords{QStringLiteral("ruqola"), QStringLiteral("kde")}; 0150 QTest::newRow("lowercase") << QStringLiteral("Ruqola") << QStringLiteral("foo") << highlightWords 0151 << QStringLiteral("<div><a style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">Ruqola</a></div>"); 0152 QTest::newRow("two-word") << QStringLiteral("Ruqola kde") << QStringLiteral("foo") << highlightWords 0153 << QStringLiteral( 0154 "<div><a style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">Ruqola</a> <a " 0155 "style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">kde</a></div>"); 0156 0157 QTest::newRow("words") << QStringLiteral("Ruqola bla kde KDE.") << QStringLiteral("foo") << highlightWords 0158 << QStringLiteral( 0159 "<div><a style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">Ruqola</a> bla <a " 0160 "style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">kde</a> <a " 0161 "style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">KDE</a>.</div>"); 0162 0163 QTest::newRow("wordinurl") << QStringLiteral("https://www.kde.org/~/bla/bli.txt") << QStringLiteral("bla") << highlightWords 0164 << QStringLiteral( 0165 "<div><a href=\"https://www.kde.org/~/bla/bli.txt\">https://www.<a " 0166 "style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">kde</a>.org/~/bla/bli.txt</a></div>"); 0167 QTest::newRow("channelruqola") 0168 << QStringLiteral("#ruqola-bla bla kde KDE.") << QStringLiteral("foo") << highlightWords 0169 << QStringLiteral( 0170 "<div><a href='ruqola:/room/ruqola-bla'>#<a style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">ruqola</a>-bla</a> bla <a " 0171 "style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">kde</a> <a " 0172 "style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">KDE</a>.</div>"); 0173 } 0174 0175 void TextConverterTest::shouldHighlightWords() 0176 { 0177 QFETCH(QString, input); 0178 QFETCH(QString, username); 0179 QFETCH(QStringList, highlightWords); 0180 QFETCH(QString, output); 0181 0182 output = prepareExpectedOutput(output); 0183 0184 QString needUpdateMessageId; 0185 int recursiveIndex = 0; 0186 const TextConverter::ConvertMessageTextSettings settings(input, username, {}, highlightWords, nullptr, nullptr, {}, {}); 0187 QCOMPARE(TextConverter::convertMessageText(settings, needUpdateMessageId, recursiveIndex), output); 0188 } 0189 0190 void TextConverterTest::shouldHighlightText_data() 0191 { 0192 QTest::addColumn<QString>("input"); 0193 QTest::addColumn<QString>("username"); 0194 QTest::addColumn<QString>("output"); 0195 QTest::newRow("empty") << QString() << QString() << QString(); 0196 QTest::newRow("word@1") << QStringLiteral("@foo") << QString() << QStringLiteral("<div><a href='ruqola:/user/foo'>@foo</a></div>"); 0197 KColorScheme colorScheme; 0198 const auto userMentionForegroundColor = colorScheme.foreground(KColorScheme::NegativeText).color().name(); 0199 const auto userMentionBackgroundColor = colorScheme.background(KColorScheme::NegativeBackground).color().name(); 0200 QTest::newRow("word@1-username") << QStringLiteral("@foo") << QStringLiteral("foo") 0201 << QStringLiteral("<div><a href='ruqola:/user/foo' style=\"color:%1;background-color:%2;font-weight:bold\">@foo</a></div>") 0202 .arg(userMentionForegroundColor, userMentionBackgroundColor); 0203 QTest::newRow("word@2-username") << QStringLiteral("bla bla @foo") << QStringLiteral("foo") 0204 << QStringLiteral( 0205 "<div>bla bla <a href='ruqola:/user/foo' style=\"color:%1;background-color:%2;font-weight:bold\">@foo</a></div>") 0206 .arg(userMentionForegroundColor, userMentionBackgroundColor); 0207 } 0208 0209 void TextConverterTest::shouldHighlightText() 0210 { 0211 QFETCH(QString, input); 0212 QFETCH(QString, username); 0213 QFETCH(QString, output); 0214 0215 output = prepareExpectedOutput(output); 0216 QString needUpdateMessageId; 0217 int recursiveIndex = 0; 0218 const TextConverter::ConvertMessageTextSettings settings(input, username, {}, {}, nullptr, nullptr, {}, {}); 0219 QCOMPARE(TextConverter::convertMessageText(settings, needUpdateMessageId, recursiveIndex), output); 0220 } 0221 0222 void TextConverterTest::shouldConvertTextWithEmoji_data() 0223 { 0224 QTest::addColumn<QString>("input"); 0225 QTest::addColumn<QString>("output"); 0226 QTest::addColumn<QString>("serverUrl"); 0227 QTest::newRow("empty") << QString() << QString() << QStringLiteral("www.kde.org"); 0228 QTest::newRow("bold") << QStringLiteral("*foo*") << QStringLiteral("<div><b>foo</b></div>") << QStringLiteral("www.kde.org"); 0229 QTest::newRow("italic") << QStringLiteral("_foo_") << QStringLiteral("<div><i>foo</i></div>") << QStringLiteral("www.kde.org"); 0230 // TODO error 0231 QTest::newRow("italic2") << QStringLiteral("_personal: theming related tasks_") << QStringLiteral("<div><i>personal: theming related tasks</i></div>") 0232 << QStringLiteral("www.kde.org"); 0233 QTest::newRow("simpletext") << QStringLiteral("foo") << QStringLiteral("<div>foo</div>") << QStringLiteral("www.kde.org"); 0234 QTest::newRow("customemojiwithmanager") << QStringLiteral(":foo:") << QStringLiteral("<div>:foo:</div>") << QStringLiteral("www.kde.org"); 0235 0236 QString smiley; 0237 smiley += QChar(0xD83D); 0238 smiley += QChar(0xDE42); 0239 const auto smileyText = QStringLiteral("<span style=\"font: x-large %2\" title=\":slight_smile:\">%1</span>").arg(smiley, Utils::emojiFontName()); 0240 QTest::newRow("ascii-smiley") << QStringLiteral(":)") << QStringLiteral("<div>%1</div>").arg(smileyText) << QStringLiteral("www.kde.org"); 0241 QTest::newRow("multi-smiley") << QStringLiteral(":):slight_smile::):)") << QStringLiteral("<div>%1</div>").arg(smileyText.repeated(4)) 0242 << QStringLiteral("www.kde.org"); 0243 0244 QTest::newRow("url") << QStringLiteral("https://www.kde.org") << QStringLiteral("<div><a href=\"https://www.kde.org\">https://www.kde.org</a></div>") 0245 << QStringLiteral("www.kde.org"); 0246 0247 QTest::newRow("\")") << QStringLiteral("\")") << QStringLiteral("<div>")</div>") << QStringLiteral("www.kde.org"); 0248 0249 // QTest::newRow("customemojiwithmanager1") << QStringLiteral(":vader:") 0250 // << QStringLiteral("<div><img height='22' width='22' src='http://www.kde.org/emoji-custom/vader.png' 0251 // title=':vader:'/></div>") 0252 // << QStringLiteral("www.kde.org"); 0253 // QTest::newRow("customemojiwithmanager2") << QStringLiteral(":vader::vader:") 0254 // << QStringLiteral( 0255 // "<div><img height='22' width='22' src='http://www.kde.org/emoji-custom/vader.png' title=':vader:'/><img height='22' width='22' 0256 // src='http://www.kde.org/emoji-custom/vader.png' title=':vader:'/></div>") 0257 // << QStringLiteral("www.kde.org"); 0258 0259 // //Use server with http:// 0260 // QTest::newRow("customemojiwithmanager3") << QStringLiteral("the icon for vader is :vader::vader:") 0261 // << QStringLiteral( 0262 // "<div>the icon for vader is <img height='22' width='22' src='http://www.kde.org/emoji-custom/vader.png' title=':vader:'/><img height='22' 0263 // width='22' src='http://www.kde.org/emoji-custom/vader.png' title=':vader:'/></div>") 0264 // << QStringLiteral("http://www.kde.org"); 0265 0266 // //alias support 0267 // QTest::newRow("customemojiwithmanager4-with-alias") << QStringLiteral(":darth::vader:") 0268 // << QStringLiteral( 0269 // "<div><img height='22' width='22' src='http://www.kde.org/emoji-custom/vader.png' title=':vader:'/><img height='22' width='22' 0270 // src='http://www.kde.org/emoji-custom/vader.png' title=':vader:'/></div>") 0271 // << QStringLiteral("http://www.kde.org"); 0272 0273 QTest::newRow("quotedcode1") << QStringLiteral("bla```foo```blub") 0274 << QStringLiteral( 0275 "<div>bla</div><table><tr><td style='background-color:$BGCOLOR$; padding: 5px; border: 1px solid " 0276 "$BORDERCOLOR$'><code>foo</code></td></tr></table><div>blub</div>") 0277 << QStringLiteral("www.kde.org"); 0278 QTest::newRow("quotedcode2") << QStringLiteral("bla\n```foo```bli") 0279 << QStringLiteral( 0280 "<div>bla</div><table><tr><td style='background-color:$BGCOLOR$; padding: 5px; border: 1px solid " 0281 "$BORDERCOLOR$'><code>foo</code></td></tr></table><div>bli</div>") 0282 << QStringLiteral("www.kde.org"); 0283 QTest::newRow("quotedcode3") << QStringLiteral("bla\n```foo```") 0284 << QStringLiteral( 0285 "<div>bla</div><table><tr><td style='background-color:$BGCOLOR$; padding: 5px; border: 1px solid " 0286 "$BORDERCOLOR$'><code>foo</code></td></tr></table>") 0287 << QStringLiteral("www.kde.org"); 0288 QTest::newRow("quotedcode4") << QStringLiteral("```foo```\nff") 0289 << QStringLiteral( 0290 "<table><tr><td style='background-color:$BGCOLOR$; padding: 5px; border: 1px solid " 0291 "$BORDERCOLOR$'><code>foo</code></td></tr></table><div>ff</div>") 0292 << QStringLiteral("www.kde.org"); 0293 QTest::newRow("quotedcode5") << QStringLiteral("bla\n```\nfoo\n```\nff") 0294 << QStringLiteral( 0295 "<div>bla</div><table><tr><td style='background-color:$BGCOLOR$; padding: 5px; border: 1px solid " 0296 "$BORDERCOLOR$'><code>foo</code></td></tr></table><div>ff</div>") 0297 << QStringLiteral("www.kde.org"); 0298 QTest::newRow("quotedcode6") 0299 << QStringLiteral("*foo*\n```\nfoo\n```\n*bar*\n```blub```\n*asdf*") 0300 << QStringLiteral( 0301 "<div><b>foo</b></div><table><tr><td style='background-color:$BGCOLOR$; padding: 5px; border: 1px solid " 0302 "$BORDERCOLOR$'><code>foo</code></td></tr></table><div><b>bar</b></div><table><tr><td style='background-color:$BGCOLOR$; padding: 5px; border: " 0303 "1px solid $BORDERCOLOR$'><code>blub</code></td></tr></table><div><b>asdf</b></div>") 0304 << QStringLiteral("www.kde.org"); 0305 QTest::newRow("quotedcode7") << QStringLiteral(":)\n```\n:)\n```\n:)") 0306 << QStringLiteral( 0307 "<div>%1</div><table><tr><td style='background-color:$BGCOLOR$; padding: 5px; border: 1px solid " 0308 "$BORDERCOLOR$'><code>:)</code></td></tr></table><div>%1</div>") 0309 .arg(smileyText) 0310 << QStringLiteral("www.kde.org"); 0311 QTest::newRow("quotedcode8") 0312 << QStringLiteral("```javascript\ncode\n```") 0313 << QStringLiteral( 0314 "<table><tr><td style='background-color:$BGCOLOR$; padding: 5px; border: 1px solid $BORDERCOLOR$'><code>code</code></td></tr></table>") 0315 << QStringLiteral("www.kde.org"); 0316 QTest::newRow("quotedcode9") 0317 << QStringLiteral("```blub\ncode\n```") 0318 << QStringLiteral( 0319 "<table><tr><td style='background-color:$BGCOLOR$; padding: 5px; border: 1px solid $BORDERCOLOR$'><code>blub<br>code</code></td></tr></table>") 0320 << QStringLiteral("www.kde.org"); 0321 0322 QTest::newRow("inline-code-with-brackets") 0323 << QStringLiteral("`[[test]]` and `a[b` something") 0324 << QStringLiteral( 0325 "<div><code style='background-color:$BGCOLOR$'>[[test]]</code> and <code style='background-color:$BGCOLOR$'>a[b</code> " 0326 "something</div>") 0327 << QStringLiteral("www.kde.org"); 0328 0329 QTest::newRow("inline-code-with-tilde") << QStringLiteral("`auto [a, b] = std::minmax_element(~~~);`") 0330 << QStringLiteral( 0331 "<div><code style='background-color:$BGCOLOR$'>auto [a, b] = " 0332 "std::minmax_element(~~~);</code></div>") 0333 << QStringLiteral("www.kde.org"); 0334 0335 QTest::newRow("inline-code-with-smiley") << QStringLiteral(":) `:)` :)") 0336 << QStringLiteral("<div>%1 <code style='background-color:$BGCOLOR$'>:)</code> %1</div>").arg(smileyText) 0337 << QStringLiteral("www.kde.org"); 0338 0339 QTest::newRow("url-with-emoji") << QStringLiteral("https://www.kde.org/:x:/bla.html") 0340 << QStringLiteral("<div>%1 <code style='background-color:$BGCOLOR$'>:)</code> %1</div>").arg(smileyText) 0341 << QStringLiteral("www.kde.org"); 0342 } 0343 0344 void TextConverterTest::shouldConvertTextWithEmoji() 0345 { 0346 QFETCH(QString, input); 0347 QFETCH(QString, output); 0348 QFETCH(QString, serverUrl); 0349 0350 output = prepareExpectedOutput(output); 0351 0352 // Load emoji 0353 const QString originalJsonFile = QLatin1String(RUQOLA_DATA_DIR) + QLatin1String("/json/restapi/emojiparent.json"); 0354 const QJsonObject obj = AutoTestHelper::loadJsonObject(originalJsonFile); 0355 EmojiManager manager(nullptr); 0356 manager.loadCustomEmoji(obj); 0357 manager.setServerUrl(serverUrl); 0358 0359 QString needUpdateMessageId; 0360 int recursiveIndex = 0; 0361 const TextConverter::ConvertMessageTextSettings settings(input, QString(), {}, {}, &manager, nullptr, {}, {}); 0362 auto actualOutput = TextConverter::convertMessageText(settings, needUpdateMessageId, recursiveIndex); 0363 if (QLatin1String(QTest::currentDataTag()) == QLatin1String("quotedcode7")) { 0364 // remove additional highlighting of the ':)' symbols within the <code> block 0365 // the text color is syntax highlighting theme dependent, so hard for us to check 0366 actualOutput.replace(QRegularExpression(QStringLiteral("<code><span style=\".+\">:\\)</span></code>")), QStringLiteral("<code>:)</code>")); 0367 } 0368 QEXPECT_FAIL("url-with-emoji", "Currently it if we have a emoji char in url", Continue); 0369 QCOMPARE(actualOutput, output); // TODO add autotest for highlightwords 0370 } 0371 0372 void TextConverterTest::shouldShowChannels_data() 0373 { 0374 QTest::addColumn<QString>("input"); 0375 QTest::addColumn<QString>("output"); 0376 QTest::addColumn<QMap<QString, QString>>("mentions"); 0377 QTest::addColumn<QMap<QString, QString>>("channels"); 0378 0379 { 0380 QMap<QString, QString> mentions; 0381 QMap<QString, QString> channels; 0382 QTest::newRow("empty") << QString() << QString() << mentions << channels; 0383 } 0384 { 0385 QMap<QString, QString> mentions; 0386 QMap<QString, QString> channels; 0387 channels.insert(QStringLiteral("foo"), QStringLiteral("idd")); 0388 QTest::newRow("word#") << QStringLiteral("#foo") << QStringLiteral("<div><a href='ruqola:/room/idd'>#foo</a></div>") << mentions << channels; 0389 } 0390 { 0391 QMap<QString, QString> mentions; 0392 QMap<QString, QString> channels; 0393 channels.insert(QStringLiteral("bla"), QStringLiteral("idd")); 0394 QTest::newRow("not existing room") << QStringLiteral("#foo") << QStringLiteral("<div><a href='ruqola:/room/foo'>#foo</a></div>") << mentions 0395 << channels; 0396 } 0397 { 0398 QMap<QString, QString> mentions; 0399 QMap<QString, QString> channels; 0400 channels.insert(QStringLiteral("bli"), QStringLiteral("112")); 0401 channels.insert(QStringLiteral("oss"), QStringLiteral("kli")); 0402 QTest::newRow("multi channel") << QStringLiteral("foo #bli blass #oss") 0403 << QStringLiteral("<div>foo <a href='ruqola:/room/112'>#bli</a> blass <a href='ruqola:/room/kli'>#oss</a></div>") 0404 << mentions << channels; 0405 } 0406 } 0407 0408 void TextConverterTest::shouldShowChannels() 0409 { 0410 using map = QMap<QString, QString>; 0411 QFETCH(QString, input); 0412 QFETCH(QString, output); 0413 QFETCH(map, mentions); 0414 QFETCH(map, channels); 0415 0416 output = prepareExpectedOutput(output); 0417 QString needUpdateMessageId; 0418 int recursiveIndex = 0; 0419 const TextConverter::ConvertMessageTextSettings settings(input, {}, {}, {}, nullptr, nullptr, mentions, channels); 0420 QCOMPARE(TextConverter::convertMessageText(settings, needUpdateMessageId, recursiveIndex), output); 0421 } 0422 0423 void TextConverterTest::shouldShowUsers() 0424 { 0425 using map = QMap<QString, QString>; 0426 QFETCH(QString, input); 0427 QFETCH(QString, output); 0428 QFETCH(map, mentions); 0429 QFETCH(map, channels); 0430 0431 output = prepareExpectedOutput(output); 0432 QString needUpdateMessageId; 0433 int recursiveIndex = 0; 0434 const TextConverter::ConvertMessageTextSettings settings(input, {}, {}, {}, nullptr, nullptr, mentions, channels); 0435 QCOMPARE(TextConverter::convertMessageText(settings, needUpdateMessageId, recursiveIndex), output); 0436 } 0437 0438 void TextConverterTest::shouldShowUsers_data() 0439 { 0440 QTest::addColumn<QString>("input"); 0441 QTest::addColumn<QString>("output"); 0442 QTest::addColumn<QMap<QString, QString>>("mentions"); 0443 QTest::addColumn<QMap<QString, QString>>("channels"); 0444 0445 { 0446 QMap<QString, QString> mentions; 0447 QMap<QString, QString> channels; 0448 QTest::newRow("empty") << QString() << QString() << mentions << channels; 0449 } 0450 { 0451 QMap<QString, QString> mentions; 0452 mentions.insert(QStringLiteral("kde"), QStringLiteral("bb")); 0453 QMap<QString, QString> channels; 0454 channels.insert(QStringLiteral("foo"), QStringLiteral("idd")); 0455 QTest::newRow("channel-user1") << QStringLiteral("#foo @kde") 0456 << QStringLiteral("<div><a href='ruqola:/room/idd'>#foo</a> <a href='ruqola:/user/bb'>@kde</a></div>") << mentions 0457 << channels; 0458 } 0459 0460 { 0461 QMap<QString, QString> mentions; 0462 mentions.insert(QStringLiteral("kde1"), QStringLiteral("bb")); 0463 QMap<QString, QString> channels; 0464 channels.insert(QStringLiteral("foo2"), QStringLiteral("idd")); 0465 QTest::newRow("channel-user-unknown") << QStringLiteral("#foo @kde") 0466 << QStringLiteral("<div><a href='ruqola:/room/foo'>#foo</a> <a href='ruqola:/user/kde'>@kde</a></div>") 0467 << mentions << channels; 0468 } 0469 } 0470 0471 void TextConverterTest::shouldShowSearchedText_data() 0472 { 0473 QTest::addColumn<QString>("input"); 0474 QTest::addColumn<QString>("username"); 0475 QTest::addColumn<QStringList>("highlightWords"); 0476 QTest::addColumn<QString>("searchedText"); 0477 QTest::addColumn<QString>("output"); 0478 QTest::newRow("empty") << QString() << QString() << QStringList{} << QString() << QString(); 0479 const QStringList highlightWords{QStringLiteral("ruqola"), QStringLiteral("kde")}; 0480 QTest::newRow("lowercase") << QStringLiteral("Ruqola") << QStringLiteral("foo") << highlightWords << QString() 0481 << QStringLiteral("<div><a style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">Ruqola</a></div>"); 0482 QTest::newRow("two-word") << QStringLiteral("Ruqola kde") << QStringLiteral("foo") << highlightWords << QString() 0483 << QStringLiteral( 0484 "<div><a style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">Ruqola</a> <a " 0485 "style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">kde</a></div>"); 0486 0487 QTest::newRow("words") << QStringLiteral("Ruqola bla kde KDE.") << QStringLiteral("foo") << highlightWords << QString() 0488 << QStringLiteral( 0489 "<div><a style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">Ruqola</a> bla <a " 0490 "style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">kde</a> <a " 0491 "style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">KDE</a>.</div>"); 0492 0493 QTest::newRow("wordinurl") << QStringLiteral("https://www.kde.org/~/bla/bli.txt") << QStringLiteral("bla") << highlightWords << QString() 0494 << QStringLiteral( 0495 "<div><a href=\"https://www.kde.org/~/bla/bli.txt\">https://www.<a " 0496 "style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">kde</a>.org/~/bla/bli.txt</a></div>"); 0497 QTest::newRow("channelruqola") 0498 << QStringLiteral("#ruqola-bla bla kde KDE.") << QStringLiteral("foo") << highlightWords << QString() 0499 << QStringLiteral( 0500 "<div><a href='ruqola:/room/ruqola-bla'>#<a style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">ruqola</a>-bla</a> bla <a " 0501 "style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">kde</a> <a " 0502 "style=\"color:$USERCOLOR$;background-color:$USERBGCOLOR$;\">KDE</a>.</div>"); 0503 } 0504 0505 void TextConverterTest::shouldShowSearchedText() 0506 { 0507 QFETCH(QString, input); 0508 QFETCH(QString, username); 0509 QFETCH(QStringList, highlightWords); 0510 QFETCH(QString, searchedText); 0511 QFETCH(QString, output); 0512 0513 output = prepareExpectedOutput(output); 0514 0515 QString needUpdateMessageId; 0516 int recursiveIndex = 0; 0517 const TextConverter::ConvertMessageTextSettings settings(input, username, {}, highlightWords, nullptr, nullptr, {}, {}, searchedText); 0518 QCOMPARE(TextConverter::convertMessageText(settings, needUpdateMessageId, recursiveIndex), output); 0519 } 0520 0521 #include "moc_textconvertertest.cpp"