summaryrefslogtreecommitdiffstats
path: root/tests/auto/qtextdocumentlayout
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@nokia.com>2009-03-23 10:18:55 +0100
committerSimon Hausmann <simon.hausmann@nokia.com>2009-03-23 10:18:55 +0100
commite5fcad302d86d316390c6b0f62759a067313e8a9 (patch)
treec2afbf6f1066b6ce261f14341cf6d310e5595bc1 /tests/auto/qtextdocumentlayout
Long live Qt 4.5!
Diffstat (limited to 'tests/auto/qtextdocumentlayout')
-rw-r--r--tests/auto/qtextdocumentlayout/.gitignore1
-rw-r--r--tests/auto/qtextdocumentlayout/qtextdocumentlayout.pro4
-rw-r--r--tests/auto/qtextdocumentlayout/tst_qtextdocumentlayout.cpp254
3 files changed, 259 insertions, 0 deletions
diff --git a/tests/auto/qtextdocumentlayout/.gitignore b/tests/auto/qtextdocumentlayout/.gitignore
new file mode 100644
index 0000000000..80671c70d0
--- /dev/null
+++ b/tests/auto/qtextdocumentlayout/.gitignore
@@ -0,0 +1 @@
+tst_qtextdocumentlayout
diff --git a/tests/auto/qtextdocumentlayout/qtextdocumentlayout.pro b/tests/auto/qtextdocumentlayout/qtextdocumentlayout.pro
new file mode 100644
index 0000000000..b2dc6a1f68
--- /dev/null
+++ b/tests/auto/qtextdocumentlayout/qtextdocumentlayout.pro
@@ -0,0 +1,4 @@
+load(qttest_p4)
+SOURCES += tst_qtextdocumentlayout.cpp
+
+
diff --git a/tests/auto/qtextdocumentlayout/tst_qtextdocumentlayout.cpp b/tests/auto/qtextdocumentlayout/tst_qtextdocumentlayout.cpp
new file mode 100644
index 0000000000..36de574439
--- /dev/null
+++ b/tests/auto/qtextdocumentlayout/tst_qtextdocumentlayout.cpp
@@ -0,0 +1,254 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include <QtTest/QtTest>
+
+#include <qtextdocument.h>
+#include <qabstracttextdocumentlayout.h>
+#include <qdebug.h>
+#include <qpainter.h>
+#include <qtexttable.h>
+#include <qtextedit.h>
+#include <qscrollbar.h>
+
+//TESTED_CLASS=
+//TESTED_FILES=gui/text/qtextdocumentlayout_p.h gui/text/qtextdocumentlayout.cpp
+
+class tst_QTextDocumentLayout : public QObject
+{
+ Q_OBJECT
+public:
+ inline tst_QTextDocumentLayout() {}
+ virtual ~tst_QTextDocumentLayout() {}
+
+public slots:
+ void init();
+ void cleanup();
+
+private slots:
+ void defaultPageSizeHandling();
+ void idealWidth();
+ void lineSeparatorFollowingTable();
+ void wrapAtWordBoundaryOrAnywhere();
+ void inlineImage();
+ void clippedTableCell();
+
+private:
+ QTextDocument *doc;
+};
+
+void tst_QTextDocumentLayout::init()
+{
+ doc = new QTextDocument;
+}
+
+void tst_QTextDocumentLayout::cleanup()
+{
+ delete doc;
+ doc = 0;
+}
+
+void tst_QTextDocumentLayout::defaultPageSizeHandling()
+{
+ QAbstractTextDocumentLayout *layout = doc->documentLayout();
+ QVERIFY(layout);
+
+ QVERIFY(!doc->pageSize().isValid());
+ QSizeF docSize = layout->documentSize();
+ QVERIFY(docSize.width() > 0 && docSize.width() < 1000);
+ QVERIFY(docSize.height() > 0 && docSize.height() < 1000);
+
+ doc->setPlainText("Some text\nwith a few lines\nand not real information\nor anything otherwise useful");
+
+ docSize = layout->documentSize();
+ QVERIFY(docSize.isValid());
+ QVERIFY(docSize.width() != INT_MAX);
+ QVERIFY(docSize.height() != INT_MAX);
+}
+
+void tst_QTextDocumentLayout::idealWidth()
+{
+ doc->setPlainText("Some text\nwith a few lines\nand not real information\nor anything otherwise useful");
+ doc->setTextWidth(1000);
+ QCOMPARE(doc->textWidth(), qreal(1000));
+ QCOMPARE(doc->size().width(), doc->textWidth());
+ QVERIFY(doc->idealWidth() < doc->textWidth());
+ QVERIFY(doc->idealWidth() > 0);
+
+ QTextBlockFormat fmt;
+ fmt.setAlignment(Qt::AlignRight | Qt::AlignAbsolute);
+ QTextCursor cursor(doc);
+ cursor.select(QTextCursor::Document);
+ cursor.mergeBlockFormat(fmt);
+
+ QCOMPARE(doc->textWidth(), qreal(1000));
+ QCOMPARE(doc->size().width(), doc->textWidth());
+ QVERIFY(doc->idealWidth() < doc->textWidth());
+ QVERIFY(doc->idealWidth() > 0);
+}
+
+// none of the QTextLine items in the document should intersect with the margin rect
+void tst_QTextDocumentLayout::lineSeparatorFollowingTable()
+{
+ QString html_begin("<html><table border=1><tr><th>Column 1</th></tr><tr><td>Data</td></tr></table><br>");
+ QString html_text("bla bla bla bla bla bla bla bla<br>");
+ QString html_end("<table border=1><tr><th>Column 1</th></tr><tr><td>Data</td></tr></table></html>");
+
+ QString html = html_begin;
+
+ for (int i = 0; i < 80; ++i)
+ html += html_text;
+
+ html += html_end;
+
+ doc->setHtml(html);
+
+ QTextCursor cursor(doc);
+ cursor.movePosition(QTextCursor::Start);
+
+ const int margin = 87;
+ const int pageWidth = 873;
+ const int pageHeight = 1358;
+
+ QTextFrameFormat fmt = doc->rootFrame()->frameFormat();
+ fmt.setMargin(margin);
+ doc->rootFrame()->setFrameFormat(fmt);
+
+ QFont font(doc->defaultFont());
+ font.setPointSize(10);
+ doc->setDefaultFont(font);
+ doc->setPageSize(QSizeF(pageWidth, pageHeight));
+
+ QRectF marginRect(QPointF(0, pageHeight - margin), QSizeF(pageWidth, 2 * margin));
+
+ // force layouting
+ doc->pageCount();
+
+ for (QTextBlock block = doc->begin(); block != doc->end(); block = block.next()) {
+ QTextLayout *layout = block.layout();
+ for (int i = 0; i < layout->lineCount(); ++i) {
+ QTextLine line = layout->lineAt(i);
+ QRectF rect = line.rect().translated(layout->position());
+ QVERIFY(!rect.intersects(marginRect));
+ }
+ }
+}
+
+void tst_QTextDocumentLayout::wrapAtWordBoundaryOrAnywhere()
+{
+ //task 150562
+ QTextEdit edit;
+ edit.setText("<table><tr><td>hello hello hello"
+ "thisisabigwordthisisabigwordthisisabigwordthisisabigwordthisisabigword"
+ "hello hello hello</td></tr></table>");
+ edit.setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
+ edit.resize(100, 100);
+ edit.show();
+ QVERIFY(!edit.horizontalScrollBar()->isVisible());
+}
+
+void tst_QTextDocumentLayout::inlineImage()
+{
+ doc->setPageSize(QSizeF(800, 500));
+
+ QImage img(400, 400, QImage::Format_RGB32);
+ QLatin1String name("bigImage");
+
+ doc->addResource(QTextDocument::ImageResource, QUrl(name), img);
+
+ QTextImageFormat imgFormat;
+ imgFormat.setName(name);
+ imgFormat.setWidth(img.width());
+
+ QTextFrameFormat fmt = doc->rootFrame()->frameFormat();
+ qreal height = doc->pageSize().height() - fmt.topMargin() - fmt.bottomMargin();
+ imgFormat.setHeight(height);
+
+ QTextCursor cursor(doc);
+ cursor.insertImage(imgFormat);
+
+ QCOMPARE(doc->pageCount(), 1);
+}
+
+void tst_QTextDocumentLayout::clippedTableCell()
+{
+ const char *html =
+ "<table style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\""
+ "border=\"0\" margin=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr><td></td></tr></table>";
+
+ doc->setHtml(html);
+ doc->pageSize();
+
+ QTextCursor cursor(doc);
+ cursor.movePosition(QTextCursor::Right);
+
+ QTextTable *table = cursor.currentTable();
+ QVERIFY(table);
+
+ QTextCursor cellCursor = table->cellAt(0, 0).firstCursorPosition();
+ QImage src(16, 16, QImage::Format_ARGB32_Premultiplied);
+ src.fill(0xffff0000);
+ cellCursor.insertImage(src);
+
+ QTextBlock block = cellCursor.block();
+ QRectF r = doc->documentLayout()->blockBoundingRect(block);
+
+ QRectF rect(0, 0, r.left() + 1, 64);
+
+ QImage img(64, 64, QImage::Format_ARGB32_Premultiplied);
+ img.fill(0x0);
+ QImage expected = img;
+ QPainter p(&img);
+ doc->drawContents(&p, rect);
+ p.end();
+ p.begin(&expected);
+ r.setWidth(1);
+ p.fillRect(r, Qt::red);
+ p.end();
+
+ img.save("img.png");
+ expected.save("expected.png");
+ QCOMPARE(img, expected);
+}
+
+QTEST_MAIN(tst_QTextDocumentLayout)
+#include "tst_qtextdocumentlayout.moc"