summaryrefslogtreecommitdiffstats
path: root/tests/auto/gui
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@qt.io>2020-01-13 22:45:01 +0100
committerShawn Rutledge <shawn.rutledge@qt.io>2020-05-27 11:55:02 +0200
commit3373aa8b351691d395cd15c634ca1b60fd688c6a (patch)
treeed7f963f5ea74d41c9cbb8c3204b6a5ffc2a3491 /tests/auto/gui
parent2503a59e353e5714b184b499e10969aed9f80465 (diff)
QTextMarkdownImporter: allow nesting text span formatting
The bold+italic combination indicated by ***triple stars*** requires this; but it enables combinations of italics, bold, strikeout, anchor text (and associated link formatting), image alternate text, and inline code formatting (monospace). A code span overrides the formatting from surrounding spans (which might be a bug to fix in another patch, if we compare to how md2html formats code nested in bold-italics for example), but the format stack restores state when any char format span ends. Task-number: QTBUG-81306 Pick-to: 5.15 Change-Id: I289556fa53de400eb50a4d159b9b344eafc517da Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'tests/auto/gui')
-rw-r--r--tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp114
1 files changed, 112 insertions, 2 deletions
diff --git a/tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp b/tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp
index 5eb04af696..78cc1da36e 100644
--- a/tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp
+++ b/tests/auto/gui/text/qtextmarkdownimporter/tst_qtextmarkdownimporter.cpp
@@ -27,13 +27,15 @@
****************************************************************************/
#include <QtTest/QtTest>
+#include <QBuffer>
+#include <QDebug>
+#include <QFontInfo>
#include <QTextDocument>
#include <QTextCursor>
#include <QTextBlock>
+#include <QTextDocumentFragment>
#include <QTextList>
#include <QTextTable>
-#include <QBuffer>
-#include <QDebug>
#include <private/qtextmarkdownimporter_p.h>
@@ -55,12 +57,28 @@ private slots:
void thematicBreaks();
void lists_data();
void lists();
+ void nestedSpans_data();
+ void nestedSpans();
void avoidBlankLineAtBeginning_data();
void avoidBlankLineAtBeginning();
void pathological_data();
void pathological();
+
+public:
+ enum CharFormat {
+ Normal = 0x0,
+ Italic = 0x1,
+ Bold = 0x02,
+ Strikeout = 0x04,
+ Mono = 0x08,
+ Link = 0x10
+ };
+ Q_DECLARE_FLAGS(CharFormats, CharFormat)
};
+Q_DECLARE_METATYPE(tst_QTextMarkdownImporter::CharFormats)
+Q_DECLARE_OPERATORS_FOR_FLAGS(tst_QTextMarkdownImporter::CharFormats)
+
void tst_QTextMarkdownImporter::headingBulletsContinuations()
{
const QStringList expectedBlocks = QStringList() <<
@@ -225,6 +243,98 @@ void tst_QTextMarkdownImporter::lists()
QCOMPARE(doc.toMarkdown(), rewrite);
}
+void tst_QTextMarkdownImporter::nestedSpans_data()
+{
+ QTest::addColumn<QString>("input");
+ QTest::addColumn<int>("wordToCheck");
+ QTest::addColumn<CharFormats>("expectedFormat");
+
+ QTest::newRow("bold italic")
+ << "before ***bold italic*** after"
+ << 1 << (Bold | Italic);
+ QTest::newRow("bold strikeout")
+ << "before **~~bold strikeout~~** after"
+ << 1 << (Bold | Strikeout);
+ QTest::newRow("italic strikeout")
+ << "before *~~italic strikeout~~* after"
+ << 1 << (Italic | Strikeout);
+ QTest::newRow("bold italic strikeout")
+ << "before ***~~bold italic strikeout~~*** after"
+ << 1 << (Bold | Italic | Strikeout);
+ QTest::newRow("bold link text")
+ << "before [**bold link**](https://qt.io) after"
+ << 1 << (Bold | Link);
+ QTest::newRow("italic link text")
+ << "before [*italic link*](https://qt.io) after"
+ << 1 << (Italic | Link);
+ QTest::newRow("bold italic link text")
+ << "before [***bold italic link***](https://qt.io) after"
+ << 1 << (Bold | Italic | Link);
+ QTest::newRow("strikeout link text")
+ << "before [~~strikeout link~~](https://qt.io) after"
+ << 1 << (Strikeout | Link);
+ QTest::newRow("strikeout bold italic link text")
+ << "before [~~***strikeout bold italic link***~~](https://qt.io) after"
+ << 1 << (Strikeout | Bold | Italic | Link);
+ QTest::newRow("bold image alt")
+ << "before [**bold image alt**](/path/to/image.png) after"
+ << 1 << (Bold | Link);
+ QTest::newRow("bold strikeout italic image alt")
+ << "before [**~~*bold strikeout italic image alt*~~**](/path/to/image.png) after"
+ << 1 << (Strikeout | Bold | Italic | Link);
+ // code spans currently override all surrounding formatting
+ QTest::newRow("code in italic span")
+ << "before *italic `code` and* after"
+ << 2 << (Mono | Normal);
+ // but the format after the code span ends should revert to what it was before
+ QTest::newRow("code in italic strikeout bold span")
+ << "before *italic ~~strikeout **bold `code` and**~~* after"
+ << 5 << (Bold | Italic | Strikeout);
+}
+
+void tst_QTextMarkdownImporter::nestedSpans()
+{
+ QFETCH(QString, input);
+ QFETCH(int, wordToCheck);
+ QFETCH(CharFormats, expectedFormat);
+
+ QTextDocument doc;
+ doc.setMarkdown(input);
+
+#ifdef DEBUG_WRITE_HTML
+ {
+ QFile out("/tmp/" + QLatin1String(QTest::currentDataTag()) + ".html");
+ out.open(QFile::WriteOnly);
+ out.write(doc.toHtml().toLatin1());
+ out.close();
+ }
+#endif
+
+ QTextFrame::iterator iterator = doc.rootFrame()->begin();
+ QTextFrame *currentFrame = iterator.currentFrame();
+ while (!iterator.atEnd()) {
+ // There are no child frames
+ QCOMPARE(iterator.currentFrame(), currentFrame);
+ // Check the QTextCharFormat of the specified word
+ QTextCursor cur(iterator.currentBlock());
+ cur.movePosition(QTextCursor::NextWord, QTextCursor::MoveAnchor, wordToCheck);
+ cur.select(QTextCursor::WordUnderCursor);
+ QTextCharFormat fmt = cur.charFormat();
+ qCDebug(lcTests) << "word" << wordToCheck << cur.selectedText() << "font" << fmt.font()
+ << "weight" << fmt.fontWeight() << "italic" << fmt.fontItalic()
+ << "strikeout" << fmt.fontStrikeOut() << "anchor" << fmt.isAnchor()
+ << "monospace" << QFontInfo(fmt.font()).fixedPitch() // depends on installed fonts (QTBUG-75649)
+ << fmt.fontFixedPitch() // returns false even when font family is "monospace"
+ << fmt.hasProperty(QTextFormat::FontFixedPitch); // works
+ QCOMPARE(fmt.fontWeight() > 50, expectedFormat.testFlag(Bold));
+ QCOMPARE(fmt.fontItalic(), expectedFormat.testFlag(Italic));
+ QCOMPARE(fmt.fontStrikeOut(), expectedFormat.testFlag(Strikeout));
+ QCOMPARE(fmt.isAnchor(), expectedFormat.testFlag(Link));
+ QCOMPARE(fmt.hasProperty(QTextFormat::FontFixedPitch), expectedFormat.testFlag(Mono));
+ ++iterator;
+ }
+}
+
void tst_QTextMarkdownImporter::avoidBlankLineAtBeginning_data()
{
QTest::addColumn<QString>("input");