1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the test suite of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
42 #include <QTextDocument>
43 #include <QtDeclarative/qdeclarativeengine.h>
44 #include <QtDeclarative/qdeclarativecomponent.h>
45 #include <QtQuick1/private/qdeclarativetext_p.h>
46 #include <QtQuick1/private/qdeclarativetext_p_p.h>
47 #include <private/qdeclarativevaluetype_p.h>
48 #include <QFontMetrics>
49 #include <QGraphicsSceneMouseEvent>
51 #include <QtQuick1/QDeclarativeView>
52 #include <QtWidgets/5.0.0/QtWidgets/private/qapplication_p.h>
55 #include "../../../shared/util.h"
56 #include "testhttpserver.h"
59 // In Symbian OS test data is located in applications private dir
63 class tst_qdeclarativetext : public QObject
68 tst_qdeclarativetext();
77 void alignments_data();
80 void embeddedImages_data();
81 void embeddedImages();
86 // ### these tests may be trivial
87 void horizontalAlignment();
88 void horizontalAlignment_RightToLeft();
89 void verticalAlignment();
95 // QDeclarativeFontValueType
100 void capitalization();
101 void letterSpacing();
107 void implicitSize_data();
109 void testQtQuick11Attributes();
110 void testQtQuick11Attributes_data();
114 QStringList standard;
115 QStringList richText;
117 QStringList horizontalAlignmentmentStrings;
118 QStringList verticalAlignmentmentStrings;
120 QList<Qt::Alignment> verticalAlignmentments;
121 QList<Qt::Alignment> horizontalAlignmentments;
123 QStringList styleStrings;
124 QList<QDeclarative1Text::TextStyle> styles;
126 QStringList colorStrings;
128 QDeclarativeEngine engine;
130 QDeclarativeView *createView(const QString &filename);
133 tst_qdeclarativetext::tst_qdeclarativetext()
135 standard << "the quick brown fox jumped over the lazy dog"
136 << "the quick brown fox\n jumped over the lazy dog";
138 richText << "<i>the <b>quick</b> brown <a href=\\\"http://www.google.com\\\">fox</a> jumped over the <b>lazy</b> dog</i>"
139 << "<i>the <b>quick</b> brown <a href=\\\"http://www.google.com\\\">fox</a><br>jumped over the <b>lazy</b> dog</i>";
141 horizontalAlignmentmentStrings << "AlignLeft"
145 verticalAlignmentmentStrings << "AlignTop"
149 horizontalAlignmentments << Qt::AlignLeft
153 verticalAlignmentments << Qt::AlignTop
157 styleStrings << "Normal"
162 styles << QDeclarative1Text::Normal
163 << QDeclarative1Text::Outline
164 << QDeclarative1Text::Raised
165 << QDeclarative1Text::Sunken;
167 colorStrings << "aliceblue"
180 // need a different test to do alpha channel test
186 QDeclarativeView *tst_qdeclarativetext::createView(const QString &filename)
188 QDeclarativeView *canvas = new QDeclarativeView(0);
190 canvas->setSource(QUrl::fromLocalFile(filename));
194 void tst_qdeclarativetext::text()
197 QDeclarativeComponent textComponent(&engine);
198 textComponent.setData("import QtQuick 1.0\nText { text: \"\" }", QUrl::fromLocalFile(""));
199 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
201 QVERIFY(textObject != 0);
202 QCOMPARE(textObject->text(), QString(""));
203 QVERIFY(textObject->width() == 0);
208 for (int i = 0; i < standard.size(); i++)
210 QString componentStr = "import QtQuick 1.0\nText { text: \"" + standard.at(i) + "\" }";
211 QDeclarativeComponent textComponent(&engine);
212 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
214 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
216 QVERIFY(textObject != 0);
217 QCOMPARE(textObject->text(), standard.at(i));
218 QVERIFY(textObject->width() > 0);
223 for (int i = 0; i < richText.size(); i++)
225 QString componentStr = "import QtQuick 1.0\nText { text: \"" + richText.at(i) + "\" }";
226 QDeclarativeComponent textComponent(&engine);
227 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
228 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
230 QVERIFY(textObject != 0);
231 QString expected = richText.at(i);
232 QCOMPARE(textObject->text(), expected.replace("\\\"", "\""));
233 QVERIFY(textObject->width() > 0);
239 void tst_qdeclarativetext::width()
241 // uses Font metrics to find the width for standard and document to find the width for rich
243 QDeclarativeComponent textComponent(&engine);
244 textComponent.setData("import QtQuick 1.0\nText { text: \"\" }", QUrl::fromLocalFile(""));
245 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
247 QVERIFY(textObject != 0);
248 QCOMPARE(textObject->width(), 0.);
253 for (int i = 0; i < standard.size(); i++)
255 QVERIFY(!Qt::mightBeRichText(standard.at(i))); // self-test
259 qreal metricWidth = fm.size(Qt::TextExpandTabs && Qt::TextShowMnemonic, standard.at(i)).width();
260 metricWidth = qCeil(metricWidth);
262 QString componentStr = "import QtQuick 1.0\nText { text: \"" + standard.at(i) + "\" }";
263 QDeclarativeComponent textComponent(&engine);
264 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
265 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
267 QVERIFY(textObject != 0);
268 QVERIFY(textObject->boundingRect().width() > 0);
269 QCOMPARE(textObject->width(), qreal(metricWidth));
270 QVERIFY(textObject->textFormat() == QDeclarative1Text::AutoText); // setting text doesn't change format
275 for (int i = 0; i < richText.size(); i++)
277 QVERIFY(Qt::mightBeRichText(richText.at(i))); // self-test
279 QTextDocument document;
280 document.setHtml(richText.at(i));
281 document.setDocumentMargin(0);
283 int documentWidth = document.idealWidth();
285 QString componentStr = "import QtQuick 1.0\nText { text: \"" + richText.at(i) + "\" }";
286 QDeclarativeComponent textComponent(&engine);
287 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
288 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
290 QVERIFY(textObject != 0);
291 QCOMPARE(textObject->width(), qreal(documentWidth));
292 QVERIFY(textObject->textFormat() == QDeclarative1Text::AutoText); // setting text doesn't change format
298 void tst_qdeclarativetext::wrap()
301 // for specified width and wrap set true
303 QDeclarativeComponent textComponent(&engine);
304 textComponent.setData("import QtQuick 1.0\nText { text: \"Hello\"; wrapMode: Text.WordWrap; width: 300 }", QUrl::fromLocalFile(""));
305 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
306 textHeight = textObject->height();
308 QVERIFY(textObject != 0);
309 QVERIFY(textObject->wrapMode() == QDeclarative1Text::WordWrap);
310 QCOMPARE(textObject->width(), 300.);
315 for (int i = 0; i < standard.size(); i++)
317 QString componentStr = "import QtQuick 1.0\nText { wrapMode: Text.WordWrap; width: 30; text: \"" + standard.at(i) + "\" }";
318 QDeclarativeComponent textComponent(&engine);
319 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
320 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
322 QVERIFY(textObject != 0);
323 QCOMPARE(textObject->width(), 30.);
324 QVERIFY(textObject->height() > textHeight);
326 int oldHeight = textObject->height();
327 textObject->setWidth(100);
328 QVERIFY(textObject->height() < oldHeight);
333 for (int i = 0; i < richText.size(); i++)
335 QString componentStr = "import QtQuick 1.0\nText { wrapMode: Text.WordWrap; width: 30; text: \"" + richText.at(i) + "\" }";
336 QDeclarativeComponent textComponent(&engine);
337 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
338 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
340 QVERIFY(textObject != 0);
341 QCOMPARE(textObject->width(), 30.);
342 QVERIFY(textObject->height() > textHeight);
344 qreal oldHeight = textObject->height();
345 textObject->setWidth(100);
346 QVERIFY(textObject->height() < oldHeight);
351 // richtext again with a fixed height
352 for (int i = 0; i < richText.size(); i++)
354 QString componentStr = "import QtQuick 1.0\nText { wrapMode: Text.WordWrap; width: 30; height: 50; text: \"" + richText.at(i) + "\" }";
355 QDeclarativeComponent textComponent(&engine);
356 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
357 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
359 QVERIFY(textObject != 0);
360 QCOMPARE(textObject->width(), 30.);
361 QVERIFY(textObject->implicitHeight() > textHeight);
363 qreal oldHeight = textObject->implicitHeight();
364 textObject->setWidth(100);
365 QVERIFY(textObject->implicitHeight() < oldHeight);
371 void tst_qdeclarativetext::elide()
373 for (QDeclarative1Text::TextElideMode m = QDeclarative1Text::ElideLeft; m<=QDeclarative1Text::ElideNone; m=QDeclarative1Text::TextElideMode(int(m)+1)) {
374 const char* elidename[]={"ElideLeft", "ElideRight", "ElideMiddle", "ElideNone"};
375 QString elide = "elide: Text." + QString(elidename[int(m)]) + ";";
377 // XXX Poor coverage.
380 QDeclarativeComponent textComponent(&engine);
381 textComponent.setData(("import QtQuick 1.0\nText { text: \"\"; "+elide+" width: 100 }").toLatin1(), QUrl::fromLocalFile(""));
382 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
384 QCOMPARE(textObject->elideMode(), m);
385 QCOMPARE(textObject->width(), 100.);
390 for (int i = 0; i < standard.size(); i++)
392 QString componentStr = "import QtQuick 1.0\nText { "+elide+" width: 100; text: \"" + standard.at(i) + "\" }";
393 QDeclarativeComponent textComponent(&engine);
394 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
395 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
397 QCOMPARE(textObject->elideMode(), m);
398 QCOMPARE(textObject->width(), 100.);
403 // richtext - does nothing
404 for (int i = 0; i < richText.size(); i++)
406 QString componentStr = "import QtQuick 1.0\nText { "+elide+" width: 100; text: \"" + richText.at(i) + "\" }";
407 QDeclarativeComponent textComponent(&engine);
408 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
409 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
411 QCOMPARE(textObject->elideMode(), m);
412 QCOMPARE(textObject->width(), 100.);
419 QUrl qmlfile = QUrl::fromLocalFile(SRCDIR "/data/elideimplicitwidth.qml");
420 QDeclarativeComponent textComponent(&engine, qmlfile);
421 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(textComponent.create());
423 QVERIFY(item->implicitWidth() > item->width());
426 void tst_qdeclarativetext::textFormat()
429 QDeclarativeComponent textComponent(&engine);
430 textComponent.setData("import QtQuick 1.0\nText { text: \"Hello\"; textFormat: Text.RichText }", QUrl::fromLocalFile(""));
431 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
433 QVERIFY(textObject != 0);
434 QVERIFY(textObject->textFormat() == QDeclarative1Text::RichText);
439 QDeclarativeComponent textComponent(&engine);
440 textComponent.setData("import QtQuick 1.0\nText { text: \"<b>Hello</b>\"; textFormat: Text.PlainText }", QUrl::fromLocalFile(""));
441 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
443 QVERIFY(textObject != 0);
444 QVERIFY(textObject->textFormat() == QDeclarative1Text::PlainText);
451 void tst_qdeclarativetext::alignments_data()
453 QTest::addColumn<int>("hAlign");
454 QTest::addColumn<int>("vAlign");
455 QTest::addColumn<QString>("expectfile");
457 QTest::newRow("LT") << int(Qt::AlignLeft) << int(Qt::AlignTop) << SRCDIR "/data/alignments_lt.png";
458 QTest::newRow("RT") << int(Qt::AlignRight) << int(Qt::AlignTop) << SRCDIR "/data/alignments_rt.png";
459 QTest::newRow("CT") << int(Qt::AlignHCenter) << int(Qt::AlignTop) << SRCDIR "/data/alignments_ct.png";
461 QTest::newRow("LB") << int(Qt::AlignLeft) << int(Qt::AlignBottom) << SRCDIR "/data/alignments_lb.png";
462 QTest::newRow("RB") << int(Qt::AlignRight) << int(Qt::AlignBottom) << SRCDIR "/data/alignments_rb.png";
463 QTest::newRow("CB") << int(Qt::AlignHCenter) << int(Qt::AlignBottom) << SRCDIR "/data/alignments_cb.png";
465 QTest::newRow("LC") << int(Qt::AlignLeft) << int(Qt::AlignVCenter) << SRCDIR "/data/alignments_lc.png";
466 QTest::newRow("RC") << int(Qt::AlignRight) << int(Qt::AlignVCenter) << SRCDIR "/data/alignments_rc.png";
467 QTest::newRow("CC") << int(Qt::AlignHCenter) << int(Qt::AlignVCenter) << SRCDIR "/data/alignments_cc.png";
471 void tst_qdeclarativetext::alignments()
475 QFETCH(QString, expectfile);
478 // Font-specific, but not likely platform-specific, so only test on one platform
480 fn.setRawName("-misc-fixed-medium-r-*-*-8-*-*-*-*-*-*-*");
481 QApplication::setFont(fn);
484 QDeclarativeView *canvas = createView(SRCDIR "/data/alignments.qml");
487 QApplication::setActiveWindow(canvas);
488 QTest::qWaitForWindowShown(canvas);
489 QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
491 QObject *ob = canvas->rootObject();
493 ob->setProperty("horizontalAlignment",hAlign);
494 ob->setProperty("verticalAlignment",vAlign);
495 QTRY_COMPARE(ob->property("running").toBool(),false);
496 QImage actual(canvas->width(), canvas->height(), QImage::Format_RGB32);
497 actual.fill(qRgb(255,255,255));
501 QImage expect(expectfile);
504 // Font-specific, but not likely platform-specific, so only test on one platform
505 if (QApplicationPrivate::graphics_system_name == "raster" || QApplicationPrivate::graphics_system_name == "") {
506 QCOMPARE(actual,expect);
513 //the alignment tests may be trivial o.oa
514 void tst_qdeclarativetext::horizontalAlignment()
516 //test one align each, and then test if two align fails.
518 for (int i = 0; i < standard.size(); i++)
520 for (int j=0; j < horizontalAlignmentmentStrings.size(); j++)
522 QString componentStr = "import QtQuick 1.0\nText { horizontalAlignment: \"" + horizontalAlignmentmentStrings.at(j) + "\"; text: \"" + standard.at(i) + "\" }";
523 QDeclarativeComponent textComponent(&engine);
524 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
525 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
527 QCOMPARE((int)textObject->hAlign(), (int)horizontalAlignmentments.at(j));
533 for (int i = 0; i < richText.size(); i++)
535 for (int j=0; j < horizontalAlignmentmentStrings.size(); j++)
537 QString componentStr = "import QtQuick 1.0\nText { horizontalAlignment: \"" + horizontalAlignmentmentStrings.at(j) + "\"; text: \"" + richText.at(i) + "\" }";
538 QDeclarativeComponent textComponent(&engine);
539 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
540 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
542 QCOMPARE((int)textObject->hAlign(), (int)horizontalAlignmentments.at(j));
550 void tst_qdeclarativetext::horizontalAlignment_RightToLeft()
552 QDeclarativeView *canvas = createView(SRCDIR "/data/horizontalAlignment_RightToLeft.qml");
553 QDeclarative1Text *text = canvas->rootObject()->findChild<QDeclarative1Text*>("text");
557 QDeclarative1TextPrivate *textPrivate = QDeclarative1TextPrivate::get(text);
558 QVERIFY(textPrivate != 0);
560 // implicit alignment should follow the reading direction of RTL text
561 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignRight);
562 QCOMPARE(text->effectiveHAlign(), text->hAlign());
563 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
565 // explicitly left aligned text
566 text->setHAlign(QDeclarative1Text::AlignLeft);
567 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignLeft);
568 QCOMPARE(text->effectiveHAlign(), text->hAlign());
569 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2);
571 // explicitly right aligned text
572 text->setHAlign(QDeclarative1Text::AlignRight);
573 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignRight);
574 QCOMPARE(text->effectiveHAlign(), text->hAlign());
575 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
577 // change to rich text
578 QString textString = text->text();
579 text->setText(QString("<i>") + textString + QString("</i>"));
580 text->setTextFormat(QDeclarative1Text::RichText);
583 // implicitly aligned rich text should follow the reading direction of text
584 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignRight);
585 QCOMPARE(text->effectiveHAlign(), text->hAlign());
586 QVERIFY(textPrivate->textDocument()->defaultTextOption().alignment() & Qt::AlignLeft);
588 // explicitly left aligned rich text
589 text->setHAlign(QDeclarative1Text::AlignLeft);
590 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignLeft);
591 QCOMPARE(text->effectiveHAlign(), text->hAlign());
592 QVERIFY(textPrivate->textDocument()->defaultTextOption().alignment() & Qt::AlignRight);
594 // explicitly right aligned rich text
595 text->setHAlign(QDeclarative1Text::AlignRight);
596 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignRight);
597 QCOMPARE(text->effectiveHAlign(), text->hAlign());
598 QVERIFY(textPrivate->textDocument()->defaultTextOption().alignment() & Qt::AlignLeft);
600 text->setText(textString);
601 text->setTextFormat(QDeclarative1Text::PlainText);
603 // explicitly center aligned
604 text->setHAlign(QDeclarative1Text::AlignHCenter);
605 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignHCenter);
606 QCOMPARE(text->effectiveHAlign(), text->hAlign());
607 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2);
608 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().right() > canvas->width()/2);
610 // reseted alignment should go back to following the text reading direction
612 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignRight);
613 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
615 // mirror the text item
616 QDeclarativeItemPrivate::get(text)->setLayoutMirror(true);
618 // mirrored implicit alignment should continue to follow the reading direction of the text
619 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignRight);
620 QCOMPARE(text->effectiveHAlign(), QDeclarative1Text::AlignRight);
621 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
623 // mirrored explicitly right aligned behaves as left aligned
624 text->setHAlign(QDeclarative1Text::AlignRight);
625 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignRight);
626 QCOMPARE(text->effectiveHAlign(), QDeclarative1Text::AlignLeft);
627 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2);
629 // mirrored explicitly left aligned behaves as right aligned
630 text->setHAlign(QDeclarative1Text::AlignLeft);
631 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignLeft);
632 QCOMPARE(text->effectiveHAlign(), QDeclarative1Text::AlignRight);
633 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2);
636 QDeclarativeItemPrivate::get(text)->setLayoutMirror(false);
639 // English text should be implicitly left aligned
640 text->setText("Hello world!");
641 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignLeft);
642 QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2);
644 #ifndef Q_OS_MAC // QTBUG-18040
645 // empty text with implicit alignment follows the system locale-based
646 // keyboard input direction from QApplication::keyboardInputDirection
648 QCOMPARE(text->hAlign(), QApplication::keyboardInputDirection() == Qt::LeftToRight ?
649 QDeclarative1Text::AlignLeft : QDeclarative1Text::AlignRight);
650 text->setHAlign(QDeclarative1Text::AlignRight);
651 QCOMPARE(text->hAlign(), QDeclarative1Text::AlignRight);
656 #ifndef Q_OS_MAC // QTBUG-18040
657 // alignment of Text with no text set to it
658 QString componentStr = "import QtQuick 1.0\nText {}";
659 QDeclarativeComponent textComponent(&engine);
660 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
661 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
662 QCOMPARE(textObject->hAlign(), QApplication::keyboardInputDirection() == Qt::LeftToRight ?
663 QDeclarative1Text::AlignLeft : QDeclarative1Text::AlignRight);
668 void tst_qdeclarativetext::verticalAlignment()
670 //test one align each, and then test if two align fails.
672 for (int i = 0; i < standard.size(); i++)
674 for (int j=0; j < verticalAlignmentmentStrings.size(); j++)
676 QString componentStr = "import QtQuick 1.0\nText { verticalAlignment: \"" + verticalAlignmentmentStrings.at(j) + "\"; text: \"" + standard.at(i) + "\" }";
677 QDeclarativeComponent textComponent(&engine);
678 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
679 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
681 QVERIFY(textObject != 0);
682 QCOMPARE((int)textObject->vAlign(), (int)verticalAlignmentments.at(j));
688 for (int i = 0; i < richText.size(); i++)
690 for (int j=0; j < verticalAlignmentmentStrings.size(); j++)
692 QString componentStr = "import QtQuick 1.0\nText { verticalAlignment: \"" + verticalAlignmentmentStrings.at(j) + "\"; text: \"" + richText.at(i) + "\" }";
693 QDeclarativeComponent textComponent(&engine);
694 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
695 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
697 QVERIFY(textObject != 0);
698 QCOMPARE((int)textObject->vAlign(), (int)verticalAlignmentments.at(j));
704 //confirm that bounding rect is correctly positioned.
705 QString componentStr = "import QtQuick 1.0\nText { height: 80; text: \"Hello\" }";
706 QDeclarativeComponent textComponent(&engine);
707 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
708 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
709 QVERIFY(textObject != 0);
710 QRectF br = textObject->boundingRect();
711 QVERIFY(br.y() == 0);
713 textObject->setVAlign(QDeclarative1Text::AlignVCenter);
714 br = textObject->boundingRect();
715 QCOMPARE(qFloor(br.y()), qFloor((80.0 - br.height())/2));
717 textObject->setVAlign(QDeclarative1Text::AlignBottom);
718 br = textObject->boundingRect();
719 QCOMPARE(qFloor(br.y()), qFloor(80.0 - br.height()));
724 void tst_qdeclarativetext::font()
726 //test size, then bold, then italic, then family
728 QString componentStr = "import QtQuick 1.0\nText { font.pointSize: 40; text: \"Hello World\" }";
729 QDeclarativeComponent textComponent(&engine);
730 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
731 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
733 QCOMPARE(textObject->font().pointSize(), 40);
734 QCOMPARE(textObject->font().bold(), false);
735 QCOMPARE(textObject->font().italic(), false);
741 QString componentStr = "import QtQuick 1.0\nText { font.pixelSize: 40; text: \"Hello World\" }";
742 QDeclarativeComponent textComponent(&engine);
743 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
744 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
746 QCOMPARE(textObject->font().pixelSize(), 40);
747 QCOMPARE(textObject->font().bold(), false);
748 QCOMPARE(textObject->font().italic(), false);
754 QString componentStr = "import QtQuick 1.0\nText { font.bold: true; text: \"Hello World\" }";
755 QDeclarativeComponent textComponent(&engine);
756 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
757 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
759 QCOMPARE(textObject->font().bold(), true);
760 QCOMPARE(textObject->font().italic(), false);
766 QString componentStr = "import QtQuick 1.0\nText { font.italic: true; text: \"Hello World\" }";
767 QDeclarativeComponent textComponent(&engine);
768 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
769 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
771 QCOMPARE(textObject->font().italic(), true);
772 QCOMPARE(textObject->font().bold(), false);
778 QString componentStr = "import QtQuick 1.0\nText { font.family: \"Helvetica\"; text: \"Hello World\" }";
779 QDeclarativeComponent textComponent(&engine);
780 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
781 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
783 QCOMPARE(textObject->font().family(), QString("Helvetica"));
784 QCOMPARE(textObject->font().bold(), false);
785 QCOMPARE(textObject->font().italic(), false);
791 QString componentStr = "import QtQuick 1.0\nText { font.family: \"\"; text: \"Hello World\" }";
792 QDeclarativeComponent textComponent(&engine);
793 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
794 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
796 QCOMPARE(textObject->font().family(), QString(""));
802 void tst_qdeclarativetext::style()
805 for (int i = 0; i < styles.size(); i++)
807 QString componentStr = "import QtQuick 1.0\nText { style: \"" + styleStrings.at(i) + "\"; styleColor: \"white\"; text: \"Hello World\" }";
808 QDeclarativeComponent textComponent(&engine);
809 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
810 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
812 QCOMPARE((int)textObject->style(), (int)styles.at(i));
813 QCOMPARE(textObject->styleColor(), QColor("white"));
817 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello World\" }";
818 QDeclarativeComponent textComponent(&engine);
819 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
820 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
822 QRectF brPre = textObject->boundingRect();
823 textObject->setStyle(QDeclarative1Text::Outline);
824 QRectF brPost = textObject->boundingRect();
826 QVERIFY(brPre.width() < brPost.width());
827 QVERIFY(brPre.height() < brPost.height());
832 void tst_qdeclarativetext::color()
835 for (int i = 0; i < colorStrings.size(); i++)
837 QString componentStr = "import QtQuick 1.0\nText { color: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }";
838 QDeclarativeComponent textComponent(&engine);
839 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
840 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
842 QCOMPARE(textObject->color(), QColor(colorStrings.at(i)));
843 QCOMPARE(textObject->styleColor(), QColor());
848 for (int i = 0; i < colorStrings.size(); i++)
850 QString componentStr = "import QtQuick 1.0\nText { styleColor: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }";
851 QDeclarativeComponent textComponent(&engine);
852 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
853 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
855 QCOMPARE(textObject->styleColor(), QColor(colorStrings.at(i)));
856 // default color to black?
857 QCOMPARE(textObject->color(), QColor("black"));
862 for (int i = 0; i < colorStrings.size(); i++)
864 for (int j = 0; j < colorStrings.size(); j++)
866 QString componentStr = "import QtQuick 1.0\nText { color: \"" + colorStrings.at(i) + "\"; styleColor: \"" + colorStrings.at(j) + "\"; text: \"Hello World\" }";
867 QDeclarativeComponent textComponent(&engine);
868 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
869 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
871 QCOMPARE(textObject->color(), QColor(colorStrings.at(i)));
872 QCOMPARE(textObject->styleColor(), QColor(colorStrings.at(j)));
878 QString colorStr = "#AA001234";
879 QColor testColor("#001234");
880 testColor.setAlpha(170);
882 QString componentStr = "import QtQuick 1.0\nText { color: \"" + colorStr + "\"; text: \"Hello World\" }";
883 QDeclarativeComponent textComponent(&engine);
884 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
885 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
887 QCOMPARE(textObject->color(), testColor);
893 void tst_qdeclarativetext::smooth()
895 for (int i = 0; i < standard.size(); i++)
898 QString componentStr = "import QtQuick 1.0\nText { smooth: true; text: \"" + standard.at(i) + "\" }";
899 QDeclarativeComponent textComponent(&engine);
900 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
901 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
902 QCOMPARE(textObject->smooth(), true);
907 QString componentStr = "import QtQuick 1.0\nText { text: \"" + standard.at(i) + "\" }";
908 QDeclarativeComponent textComponent(&engine);
909 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
910 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
911 QCOMPARE(textObject->smooth(), false);
916 for (int i = 0; i < richText.size(); i++)
919 QString componentStr = "import QtQuick 1.0\nText { smooth: true; text: \"" + richText.at(i) + "\" }";
920 QDeclarativeComponent textComponent(&engine);
921 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
922 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
923 QCOMPARE(textObject->smooth(), true);
928 QString componentStr = "import QtQuick 1.0\nText { text: \"" + richText.at(i) + "\" }";
929 QDeclarativeComponent textComponent(&engine);
930 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
931 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
932 QCOMPARE(textObject->smooth(), false);
939 void tst_qdeclarativetext::weight()
942 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
943 QDeclarativeComponent textComponent(&engine);
944 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
945 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
947 QVERIFY(textObject != 0);
948 QCOMPARE((int)textObject->font().weight(), (int)QDeclarativeFontValueType::Normal);
953 QString componentStr = "import QtQuick 1.0\nText { font.weight: \"Bold\"; text: \"Hello world!\" }";
954 QDeclarativeComponent textComponent(&engine);
955 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
956 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
958 QVERIFY(textObject != 0);
959 QCOMPARE((int)textObject->font().weight(), (int)QDeclarativeFontValueType::Bold);
965 void tst_qdeclarativetext::underline()
968 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
969 QDeclarativeComponent textComponent(&engine);
970 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
971 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
973 QVERIFY(textObject != 0);
974 QCOMPARE(textObject->font().underline(), false);
979 QString componentStr = "import QtQuick 1.0\nText { font.underline: true; text: \"Hello world!\" }";
980 QDeclarativeComponent textComponent(&engine);
981 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
982 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
984 QVERIFY(textObject != 0);
985 QCOMPARE(textObject->font().underline(), true);
991 void tst_qdeclarativetext::overline()
994 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
995 QDeclarativeComponent textComponent(&engine);
996 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
997 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
999 QVERIFY(textObject != 0);
1000 QCOMPARE(textObject->font().overline(), false);
1005 QString componentStr = "import QtQuick 1.0\nText { font.overline: true; text: \"Hello world!\" }";
1006 QDeclarativeComponent textComponent(&engine);
1007 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1008 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1010 QVERIFY(textObject != 0);
1011 QCOMPARE(textObject->font().overline(), true);
1017 void tst_qdeclarativetext::strikeout()
1020 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
1021 QDeclarativeComponent textComponent(&engine);
1022 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1023 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1025 QVERIFY(textObject != 0);
1026 QCOMPARE(textObject->font().strikeOut(), false);
1031 QString componentStr = "import QtQuick 1.0\nText { font.strikeout: true; text: \"Hello world!\" }";
1032 QDeclarativeComponent textComponent(&engine);
1033 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1034 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1036 QVERIFY(textObject != 0);
1037 QCOMPARE(textObject->font().strikeOut(), true);
1043 void tst_qdeclarativetext::capitalization()
1046 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
1047 QDeclarativeComponent textComponent(&engine);
1048 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1049 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1051 QVERIFY(textObject != 0);
1052 QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::MixedCase);
1057 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"AllUppercase\" }";
1058 QDeclarativeComponent textComponent(&engine);
1059 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1060 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1062 QVERIFY(textObject != 0);
1063 QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::AllUppercase);
1068 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"AllLowercase\" }";
1069 QDeclarativeComponent textComponent(&engine);
1070 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1071 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1073 QVERIFY(textObject != 0);
1074 QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::AllLowercase);
1079 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"SmallCaps\" }";
1080 QDeclarativeComponent textComponent(&engine);
1081 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1082 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1084 QVERIFY(textObject != 0);
1085 QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::SmallCaps);
1090 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"Capitalize\" }";
1091 QDeclarativeComponent textComponent(&engine);
1092 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1093 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1095 QVERIFY(textObject != 0);
1096 QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::Capitalize);
1102 void tst_qdeclarativetext::letterSpacing()
1105 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
1106 QDeclarativeComponent textComponent(&engine);
1107 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1108 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1110 QVERIFY(textObject != 0);
1111 QCOMPARE(textObject->font().letterSpacing(), 0.0);
1116 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.letterSpacing: -2 }";
1117 QDeclarativeComponent textComponent(&engine);
1118 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1119 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1121 QVERIFY(textObject != 0);
1122 QCOMPARE(textObject->font().letterSpacing(), -2.);
1127 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.letterSpacing: 3 }";
1128 QDeclarativeComponent textComponent(&engine);
1129 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1130 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1132 QVERIFY(textObject != 0);
1133 QCOMPARE(textObject->font().letterSpacing(), 3.);
1139 void tst_qdeclarativetext::wordSpacing()
1142 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }";
1143 QDeclarativeComponent textComponent(&engine);
1144 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1145 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1147 QVERIFY(textObject != 0);
1148 QCOMPARE(textObject->font().wordSpacing(), 0.0);
1153 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.wordSpacing: -50 }";
1154 QDeclarativeComponent textComponent(&engine);
1155 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1156 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1158 QVERIFY(textObject != 0);
1159 QCOMPARE(textObject->font().wordSpacing(), -50.);
1164 QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.wordSpacing: 200 }";
1165 QDeclarativeComponent textComponent(&engine);
1166 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1167 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1169 QVERIFY(textObject != 0);
1170 QCOMPARE(textObject->font().wordSpacing(), 200.);
1176 void tst_qdeclarativetext::QTBUG_12291()
1178 QDeclarativeView *canvas = createView(SRCDIR "/data/rotated.qml");
1181 QApplication::setActiveWindow(canvas);
1182 QTest::qWaitForWindowShown(canvas);
1183 QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
1185 QObject *ob = canvas->rootObject();
1188 QDeclarative1Text *text = ob->findChild<QDeclarative1Text*>("text");
1190 QVERIFY(text->boundingRect().isValid());
1195 class EventSender : public QGraphicsItem
1198 void sendEvent(QEvent *event) { sceneEvent(event); }
1201 class LinkTest : public QObject
1210 void linkClicked(QString l) { link = l; }
1213 void tst_qdeclarativetext::clickLink()
1216 QString componentStr = "import QtQuick 1.0\nText { text: \"<a href=\\\"http://qt.nokia.com\\\">Hello world!</a>\" }";
1217 QDeclarativeComponent textComponent(&engine);
1218 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1219 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1221 QVERIFY(textObject != 0);
1224 QObject::connect(textObject, SIGNAL(linkActivated(QString)), &test, SLOT(linkClicked(QString)));
1227 QGraphicsSceneMouseEvent me(QEvent::GraphicsSceneMousePress);
1228 me.setPos(QPointF(textObject->x()/2, textObject->y()/2));
1229 me.setButton(Qt::LeftButton);
1230 static_cast<EventSender*>(static_cast<QGraphicsItem*>(textObject))->sendEvent(&me);
1234 QGraphicsSceneMouseEvent me(QEvent::GraphicsSceneMouseRelease);
1235 me.setPos(QPointF(textObject->x()/2, textObject->y()/2));
1236 me.setButton(Qt::LeftButton);
1237 static_cast<EventSender*>(static_cast<QGraphicsItem*>(textObject))->sendEvent(&me);
1240 QCOMPARE(test.link, QLatin1String("http://qt.nokia.com"));
1246 void tst_qdeclarativetext::embeddedImages_data()
1248 QTest::addColumn<QUrl>("qmlfile");
1249 QTest::addColumn<QString>("error");
1250 QTest::newRow("local") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesLocal.qml") << "";
1251 QTest::newRow("local-error") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesLocalError.qml")
1252 << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesLocalError.qml").toString()+":3:1: QML Text: Cannot open: " + QUrl::fromLocalFile(SRCDIR "/data/http/notexists.png").toString();
1253 QTest::newRow("remote") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesRemote.qml") << "";
1254 QTest::newRow("remote-error") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesRemoteError.qml")
1255 << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesRemoteError.qml").toString()+":3:1: QML Text: Error downloading http://127.0.0.1:14453/notexists.png - server replied: Not found";
1258 void tst_qdeclarativetext::embeddedImages()
1262 QFETCH(QUrl, qmlfile);
1263 QFETCH(QString, error);
1265 TestHTTPServer server(14453);
1266 server.serveDirectory(SRCDIR "/data/http");
1268 if (!error.isEmpty())
1269 QTest::ignoreMessage(QtWarningMsg, error.toLatin1());
1271 QDeclarativeComponent textComponent(&engine, qmlfile);
1272 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1274 QVERIFY(textObject != 0);
1276 QTRY_COMPARE(textObject->resourcesLoading(), 0);
1278 QPixmap pm(SRCDIR "/data/http/exists.png");
1279 if (error.isEmpty()) {
1280 QCOMPARE(textObject->width(), double(pm.width()));
1281 QCOMPARE(textObject->height(), double(pm.height()));
1283 QVERIFY(16 != pm.width()); // check test is effective
1284 QCOMPARE(textObject->width(), 16.0); // default size of QTextDocument broken image icon
1285 QCOMPARE(textObject->height(), 16.0);
1291 void tst_qdeclarativetext::lineCount()
1293 QDeclarativeView *canvas = createView(SRCDIR "/data/lineCount.qml");
1295 QDeclarative1Text *myText = canvas->rootObject()->findChild<QDeclarative1Text*>("myText");
1296 QVERIFY(myText != 0);
1298 QVERIFY(myText->lineCount() > 1);
1299 QVERIFY(!myText->truncated());
1300 QCOMPARE(myText->maximumLineCount(), INT_MAX);
1302 myText->setMaximumLineCount(2);
1303 QCOMPARE(myText->lineCount(), 2);
1304 QCOMPARE(myText->truncated(), true);
1305 QCOMPARE(myText->maximumLineCount(), 2);
1307 myText->resetMaximumLineCount();
1308 QCOMPARE(myText->maximumLineCount(), INT_MAX);
1309 QCOMPARE(myText->truncated(), false);
1311 myText->setElideMode(QDeclarative1Text::ElideRight);
1312 myText->setMaximumLineCount(2);
1313 QCOMPARE(myText->lineCount(), 2);
1314 QCOMPARE(myText->truncated(), true);
1315 QCOMPARE(myText->maximumLineCount(), 2);
1320 void tst_qdeclarativetext::lineHeight()
1322 QDeclarativeView *canvas = createView(SRCDIR "/data/lineHeight.qml");
1324 QDeclarative1Text *myText = canvas->rootObject()->findChild<QDeclarative1Text*>("myText");
1325 QVERIFY(myText != 0);
1327 QVERIFY(myText->lineHeight() == 1);
1328 QVERIFY(myText->lineHeightMode() == QDeclarative1Text::ProportionalHeight);
1330 qreal h = myText->height();
1331 myText->setLineHeight(1.5);
1333 QEXPECT_FAIL("", "QTBUG-21015 fails", Continue);
1335 QVERIFY(myText->height() == h * 1.5);
1337 myText->setLineHeightMode(QDeclarative1Text::FixedHeight);
1338 myText->setLineHeight(20);
1339 QCOMPARE(myText->height(), myText->lineCount() * 20.0);
1341 myText->setText("Lorem ipsum sit <b>amet</b>, consectetur adipiscing elit. Integer felis nisl, varius in pretium nec, venenatis non erat. Proin lobortis interdum dictum.");
1342 myText->setLineHeightMode(QDeclarative1Text::ProportionalHeight);
1343 myText->setLineHeight(1.0);
1345 qreal h2 = myText->height();
1346 myText->setLineHeight(2.0);
1347 QEXPECT_FAIL("", "QTBUG-17325", Continue);
1348 QVERIFY(myText->height() == h2 * 2.0);
1350 myText->setLineHeightMode(QDeclarative1Text::FixedHeight);
1351 myText->setLineHeight(10);
1352 QEXPECT_FAIL("", "QTBUG-17325", Continue);
1353 QCOMPARE(myText->height(), myText->lineCount() * 10.0);
1358 void tst_qdeclarativetext::implicitSize_data()
1360 QTest::addColumn<QString>("text");
1361 QTest::addColumn<QString>("wrap");
1362 QTest::newRow("plain") << "The quick red fox jumped over the lazy brown dog" << "Text.NoWrap";
1363 QTest::newRow("richtext") << "<b>The quick red fox jumped over the lazy brown dog</b>" << "Text.NoWrap";
1364 QTest::newRow("plain_wrap") << "The quick red fox jumped over the lazy brown dog" << "Text.Wrap";
1365 QTest::newRow("richtext_wrap") << "<b>The quick red fox jumped over the lazy brown dog</b>" << "Text.Wrap";
1368 void tst_qdeclarativetext::implicitSize()
1370 QFETCH(QString, text);
1371 QFETCH(QString, wrap);
1372 QString componentStr = "import QtQuick 1.1\nText { text: \"" + text + "\"; width: 50; wrapMode: " + wrap + " }";
1373 QDeclarativeComponent textComponent(&engine);
1374 textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
1375 QDeclarative1Text *textObject = qobject_cast<QDeclarative1Text*>(textComponent.create());
1377 QVERIFY(textObject->width() < textObject->implicitWidth());
1378 QVERIFY(textObject->height() == textObject->implicitHeight());
1380 textObject->resetWidth();
1381 QVERIFY(textObject->width() == textObject->implicitWidth());
1382 QVERIFY(textObject->height() == textObject->implicitHeight());
1387 void tst_qdeclarativetext::testQtQuick11Attributes()
1389 QFETCH(QString, code);
1390 QFETCH(QString, warning);
1391 QFETCH(QString, error);
1393 QDeclarativeEngine engine;
1396 QDeclarativeComponent valid(&engine);
1397 valid.setData("import QtQuick 1.1; Text { " + code.toUtf8() + " }", QUrl(""));
1398 obj = valid.create();
1400 QVERIFY(valid.errorString().isEmpty());
1403 QDeclarativeComponent invalid(&engine);
1404 invalid.setData("import QtQuick 1.0; Text { " + code.toUtf8() + " }", QUrl(""));
1405 QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
1406 obj = invalid.create();
1407 QCOMPARE(invalid.errorString(), error);
1411 void tst_qdeclarativetext::testQtQuick11Attributes_data()
1413 QTest::addColumn<QString>("code");
1414 QTest::addColumn<QString>("warning");
1415 QTest::addColumn<QString>("error");
1417 QTest::newRow("maximumLineCount") << "maximumLineCount: 4"
1418 << "QDeclarativeComponent: Component is not ready"
1419 << ":1 \"Text.maximumLineCount\" is not available in QtQuick 1.0.\n";
1421 QTest::newRow("lineHeight") << "lineHeight: 2"
1422 << "QDeclarativeComponent: Component is not ready"
1423 << ":1 \"Text.lineHeight\" is not available in QtQuick 1.0.\n";
1425 QTest::newRow("lineHeightMode") << "lineHeightMode: Text.ProportionalHeight"
1426 << "QDeclarativeComponent: Component is not ready"
1427 << ":1 \"Text.lineHeightMode\" is not available in QtQuick 1.0.\n";
1429 QTest::newRow("lineCount") << "property int foo: lineCount"
1430 << "<Unknown File>:1: ReferenceError: Can't find variable: lineCount"
1433 QTest::newRow("truncated") << "property bool foo: truncated"
1434 << "<Unknown File>:1: ReferenceError: Can't find variable: truncated"
1438 void tst_qdeclarativetext::qtbug_14734()
1440 QDeclarativeView *canvas = createView(SRCDIR "/data/qtbug_14734.qml");
1444 QApplication::setActiveWindow(canvas);
1445 QTest::qWaitForWindowShown(canvas);
1446 QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
1451 QTEST_MAIN(tst_qdeclarativetext)
1453 #include "tst_qdeclarativetext.moc"