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\">&nbsp;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\">&nbsp;</div></div>") << false << 1;
0134     QTest::newRow("multispace")
0135         << QStringLiteral("            Bug ID: 358324")
0136         << QStringLiteral(
0137                "<div class=\"noquote\"><div dir=\"ltr\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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\">&nbsp;</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\">&nbsp;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\">&nbsp;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"