File indexing completed on 2025-03-09 04:54:34
0001 /* SPDX-FileCopyrightText: 2009 Thomas McGuire <mcguire@kde.org> 0002 0003 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0004 */ 0005 #include "quotehtmltest.h" 0006 #include "../plugins/quotehtml.h" 0007 #include "setupenv.h" 0008 #include "util.h" 0009 0010 #include <MessageViewer/BufferedHtmlWriter> 0011 #include <MessageViewer/CSSHelperBase> 0012 #include <MessageViewer/IconNameCache> 0013 #include <MessageViewer/MessagePartRendererBase> 0014 #include <MimeTreeParser/MessagePart> 0015 #include <MimeTreeParser/ObjectTreeParser> 0016 0017 #include <QTest> 0018 0019 using namespace MessageViewer; 0020 0021 QTEST_MAIN(QuoteHtmlTest) 0022 0023 class MyRenderContext : public MessageViewer::RenderContext 0024 { 0025 public: 0026 ~MyRenderContext() override = default; 0027 0028 [[nodiscard]] CSSHelperBase *cssHelper() const override 0029 { 0030 return mCssHelper; 0031 } 0032 0033 void renderSubParts(const MimeTreeParser::MessagePart::Ptr &msgPart, HtmlWriter *htmlWriter) override 0034 { 0035 Q_UNUSED(msgPart) 0036 Q_UNUSED(htmlWriter) 0037 } 0038 0039 bool isHiddenHint(const MimeTreeParser::MessagePart::Ptr &msgPart) override 0040 { 0041 Q_UNUSED(msgPart) 0042 return false; 0043 } 0044 0045 MimeTreeParser::IconType displayHint(const MimeTreeParser::MessagePart::Ptr &msgPart) override 0046 { 0047 Q_UNUSED(msgPart) 0048 return MimeTreeParser::IconType::NoIcon; 0049 } 0050 0051 [[nodiscard]] bool showEmoticons() const override 0052 { 0053 return false; 0054 } 0055 0056 [[nodiscard]] bool isPrinting() const override 0057 { 0058 return false; 0059 } 0060 0061 [[nodiscard]] bool htmlLoadExternal() const override 0062 { 0063 return false; 0064 } 0065 0066 [[nodiscard]] bool showExpandQuotesMark() const override 0067 { 0068 return mShowExpandQuotesMark; 0069 } 0070 0071 [[nodiscard]] bool showOnlyOneMimePart() const override 0072 { 0073 return false; 0074 } 0075 0076 [[nodiscard]] bool showSignatureDetails() const override 0077 { 0078 return false; 0079 } 0080 0081 [[nodiscard]] bool showEncryptionDetails() const override 0082 { 0083 return false; 0084 } 0085 0086 [[nodiscard]] int levelQuote() const override 0087 { 0088 return mLevelQuote; 0089 } 0090 0091 bool mShowExpandQuotesMark = false; 0092 int mLevelQuote = 1; 0093 CSSHelperBase *mCssHelper = nullptr; 0094 0095 protected: 0096 bool renderWithFactory(const QMetaObject *mo, const MimeTreeParser::MessagePart::Ptr &msgPart, HtmlWriter *writer) override 0097 { 0098 Q_UNUSED(mo) 0099 Q_UNUSED(msgPart) 0100 Q_UNUSED(writer) 0101 return false; 0102 } 0103 }; 0104 0105 void QuoteHtmlTest::initTestCase() 0106 { 0107 MessageViewer::Test::setupEnv(); 0108 mCollapseIcon = MessageViewer::IconNameCache::instance()->iconPathFromLocal(QStringLiteral("quotecollapse.png")); 0109 mExpandIcon = MessageViewer::IconNameCache::instance()->iconPathFromLocal(QStringLiteral("quoteexpand.png")); 0110 } 0111 0112 void QuoteHtmlTest::testQuoteHtml_data() 0113 { 0114 QTest::addColumn<QString>("data"); 0115 QTest::addColumn<QString>("result"); 0116 QTest::addColumn<bool>("showExpandQuotesMark"); 0117 QTest::addColumn<int>("quotelevel"); 0118 // No Expand Quotes 0119 QTest::newRow("simpletext") << QStringLiteral("http") << QStringLiteral("<div class=\"noquote\"><div dir=\"ltr\">http</div></div>") << false << 1; 0120 QTest::newRow("simplequote") << QStringLiteral( 0121 ">") << QStringLiteral("<blockquote><div class=\"quotelevel1\"><div dir=\"ltr\"><span class=\"quotemarksemptyline\">></span></div></div></blockquote>") 0122 << false << 1; 0123 QTest::newRow("doublequotewithtext") << QStringLiteral(">> sddf") 0124 << QStringLiteral( 0125 "<blockquote><blockquote><div class=\"quotelevel2\"><div dir=\"ltr\"><span class=\"quotemarks\">>>" 0126 "</span><font color=\"#007000\"> sddf</font></div></div></blockquote></blockquote>") 0127 << false << 1; 0128 QTest::newRow("doublequote") << QStringLiteral(">>") 0129 << QStringLiteral( 0130 "<blockquote><blockquote><div class=\"quotelevel2\"><div dir=\"ltr\"><span " 0131 "class=\"quotemarksemptyline\">>></span></div></div></blockquote></blockquote>") 0132 << false << 1; 0133 QTest::newRow("simplespace") << QStringLiteral(" ") << QStringLiteral("<div class=\"noquote\"><div dir=\"ltr\"> </div></div>") << false << 1; 0134 QTest::newRow("multispace") 0135 << QStringLiteral(" Bug ID: 358324") 0136 << QStringLiteral( 0137 "<div class=\"noquote\"><div dir=\"ltr\"> Bug ID: 358324</div></div>") 0138 << false << 1; 0139 0140 QTest::newRow("bug-369072") 0141 << QStringLiteral("test\n>quote1\n>>quote2\n>>>quote3\n>>new quote2\n>new quote1\nnew text") 0142 << QStringLiteral( 0143 "<div class=\"noquote\"><div dir=\"ltr\">test</div>" 0144 "</div><blockquote><div class=\"quotelevel1\"><div dir=\"ltr\"><span class=\"quotemarks\">></span><font color=\"#008000\">quote1</font></div>" 0145 "</div><blockquote><div class=\"quotelevel2\"><div dir=\"ltr\"><span class=\"quotemarks\">>></span><font color=\"#007000\">quote2</font></div>" 0146 "</div><blockquote><div class=\"quotelevel3\"><div dir=\"ltr\"><span class=\"quotemarks\">>>></span><font color=\"#006000\">quote3</font></div>" 0147 "</div></blockquote><div class=\"quotelevel2\"><div dir=\"ltr\"><span class=\"quotemarks\">>></span><font color=\"#007000\">new " 0148 "quote2</font></div>" 0149 "</div></blockquote><div class=\"quotelevel1\"><div dir=\"ltr\"><span class=\"quotemarks\">></span><font color=\"#008000\">new " 0150 "quote1</font></div>" 0151 "</div></blockquote><div class=\"noquote\"><div dir=\"ltr\">new text</div></div>") 0152 << false << 1; 0153 0154 // Show Expand Quotes 0155 QTest::newRow("simpletext-expand") << QStringLiteral("http") << QStringLiteral("<div class=\"noquote\"><div dir=\"ltr\">http</div></div>") << true << 1; 0156 0157 QString result = QStringLiteral( 0158 "<blockquote><div class=\"quotelevelmark\" ><a href=\"kmail:levelquote?0 \"><img src=\"%1\"/></a></div><div " 0159 "class=\"quotelevel1\"><div dir=\"ltr\"><span class=\"quotemarksemptyline\">></span></div></div></blockquote>") 0160 .arg(mCollapseIcon); 0161 QTest::newRow("simplequote-expand") << QStringLiteral(">") << result << true << 1; 0162 QTest::newRow("simplespace-expand") << QStringLiteral(" ") << QStringLiteral("<div class=\"noquote\"><div dir=\"ltr\"> </div></div>") << true << 1; 0163 0164 QTest::newRow("bug-369072-expand-quotelevel3") 0165 << QStringLiteral("test\n>quote1\n>>quote2\n>>>quote3\n>>new quote2\n>new quote1\nnew text") 0166 << QStringLiteral( 0167 "<div class=\"noquote\"><div dir=\"ltr\">test</div>" 0168 "</div><blockquote><div class=\"quotelevelmark\" ><a href=\"kmail:levelquote?0 \"><img src=\"%1\"/></a></div>" 0169 "<div class=\"quotelevel1\"><div dir=\"ltr\"><span class=\"quotemarks\">></span><font " 0170 "color=\"#008000\">quote1</font></div></div><blockquote><div class=\"quotelevelmark\" ><a href=\"kmail:levelquote?1 \"><img " 0171 "src=\"%1\"/></a></div>" 0172 "<div class=\"quotelevel2\"><div dir=\"ltr\"><span class=\"quotemarks\">>></span><font " 0173 "color=\"#007000\">quote2</font></div></div><blockquote><div class=\"quotelevelmark\" ><a href=\"kmail:levelquote?2 \"><img " 0174 "src=\"%1\"/></a></div>" 0175 "<div class=\"quotelevel3\"><div dir=\"ltr\"><span class=\"quotemarks\">>>></span><font " 0176 "color=\"#006000\">quote3</font></div></div></blockquote><div class=\"quotelevelmark\" ><a href=\"kmail:levelquote?1 \"><img " 0177 "src=\"%1\"/></a></div>" 0178 "<div class=\"quotelevel2\"><div dir=\"ltr\"><span class=\"quotemarks\">>></span><font color=\"#007000\">new " 0179 "quote2</font></div></div></blockquote><div class=\"quotelevelmark\" ><a href=\"kmail:levelquote?0 \"><img src=\"%1\"/></a></div>" 0180 "<div class=\"quotelevel1\"><div dir=\"ltr\"><span class=\"quotemarks\">></span><font color=\"#008000\">new " 0181 "quote1</font></div></div></blockquote><div class=\"noquote\"><div dir=\"ltr\">new text</div></div>") 0182 .arg(mCollapseIcon) 0183 << true << 3; 0184 0185 QTest::newRow("bug-369072-expand-quotelevel2") 0186 << QStringLiteral("test\n>quote1\n>>quote2\n>>>quote3\n>>new quote2\n>new quote1\nnew text") 0187 << QStringLiteral( 0188 "<div class=\"noquote\"><div dir=\"ltr\">test</div></div><blockquote><div class=\"quotelevelmark\" ><a href=\"kmail:levelquote?0 \"><img " 0189 "src=\"%1\"/></a></div>" 0190 "<div class=\"quotelevel1\"><div dir=\"ltr\"><span class=\"quotemarks\">></span><font " 0191 "color=\"#008000\">quote1</font></div></div><blockquote><div class=\"quotelevelmark\" ><a href=\"kmail:levelquote?1 \"><img " 0192 "src=\"%1\"/></a></div>" 0193 "<div class=\"quotelevel2\"><div dir=\"ltr\"><span class=\"quotemarks\">>></span><font " 0194 "color=\"#007000\">quote2</font></div></div><blockquote><div class=\"quotelevelmark\" ><a href=\"kmail:levelquote?-1 \"><img " 0195 "src=\"%2\"/></a></div><br/></blockquote><div class=\"quotelevelmark\" ><a href=\"kmail:levelquote?1 \"><img src=\"%1\"/></a></div>" 0196 "<div class=\"quotelevel2\"><div dir=\"ltr\"><span class=\"quotemarks\">>></span><font color=\"#007000\">new " 0197 "quote2</font></div></div></blockquote><div class=\"quotelevelmark\" ><a href=\"kmail:levelquote?0 \"><img src=\"%1\"/></a></div>" 0198 "<div class=\"quotelevel1\"><div dir=\"ltr\"><span class=\"quotemarks\">></span><font color=\"#008000\">new " 0199 "quote1</font></div></div></blockquote><div class=\"noquote\"><div dir=\"ltr\">new text</div></div>") 0200 .arg(mCollapseIcon, mExpandIcon) 0201 << true << 2; 0202 0203 QTest::newRow("bug-369072-expand-quotelevel1") 0204 << QStringLiteral("test\n>quote1\n>>quote2\n>>>quote3\n>>new quote2\n>new quote1\nnew text") 0205 << QStringLiteral( 0206 "<div class=\"noquote\"><div dir=\"ltr\">test</div></div><blockquote><div class=\"quotelevelmark\" ><a href=\"kmail:levelquote?0 \"><img " 0207 "src=\"%1\"/></a></div>" 0208 "<div class=\"quotelevel1\"><div dir=\"ltr\"><span class=\"quotemarks\">></span><font " 0209 "color=\"#008000\">quote1</font></div></div><blockquote><div class=\"quotelevelmark\" ><a href=\"kmail:levelquote?-1 \"><img " 0210 "src=\"%2\"/></a></div><br/>" 0211 "<blockquote></blockquote></blockquote><div class=\"quotelevelmark\" ><a href=\"kmail:levelquote?0 \"><img src=\"%1\"/></a></div>" 0212 "<div class=\"quotelevel1\"><div dir=\"ltr\"><span class=\"quotemarks\">></span><font color=\"#008000\">new " 0213 "quote1</font></div></div></blockquote><div class=\"noquote\"><div dir=\"ltr\">new text</div></div>") 0214 .arg(mCollapseIcon, mExpandIcon) 0215 << true << 1; 0216 0217 QTest::newRow("bug-370452") 0218 << QStringLiteral("test\n> blo\n>\n>\n>\n> bla\nnew text") 0219 << QStringLiteral( 0220 "<div class=\"noquote\">" 0221 "<div dir=\"ltr\">test</div></div>" 0222 "<blockquote><div class=\"quotelevel1\"><div dir=\"ltr\"><span class=\"quotemarks\">></span><font color=\"#008000\"> blo</font></div>" 0223 "<div dir=\"ltr\"><span class=\"quotemarksemptyline\">></span></div>" 0224 "<div dir=\"ltr\"><span class=\"quotemarksemptyline\">></span></div>" 0225 "<div dir=\"ltr\"><span class=\"quotemarksemptyline\">></span></div>" 0226 "<div dir=\"ltr\"><span class=\"quotemarks\">></span><font color=\"#008000\"> bla</font></div></div></blockquote>" 0227 "<div class=\"noquote\"><div dir=\"ltr\">new text</div></div>") 0228 << false << 1; 0229 } 0230 0231 void QuoteHtmlTest::testQuoteHtml() 0232 { 0233 QFETCH(QString, data); 0234 QFETCH(QString, result); 0235 QFETCH(bool, showExpandQuotesMark); 0236 QFETCH(int, quotelevel); 0237 BufferedHtmlWriter testWriter; 0238 Test::CSSHelper testCSSHelper; 0239 MyRenderContext context; 0240 context.mCssHelper = &testCSSHelper; 0241 context.mLevelQuote = quotelevel; 0242 context.mShowExpandQuotesMark = showExpandQuotesMark; 0243 testWriter.begin(); 0244 quotedHTML(data, &context, &testWriter); 0245 testWriter.end(); 0246 QCOMPARE(testWriter.data(), result.toUtf8()); 0247 } 0248 0249 #include "moc_quotehtmltest.cpp"